Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-06-2009, 20:14   #1
Gr1ph00n
Member
 
Iscritto dal: Oct 2006
Messaggi: 67
[C] problema stringhe in liste

Salve a tutti, posto in questa sezionepoichè stò avendo alcuni problemi con un'implementazione, stavo cercando di capire come utilizzare le liste collegate e mi era parso ideale implementare una rubrica. Non ci ho messo molto a realizzarne una semplice, fatto stà che ho un problema con la visualizzazione dei vari campi. Mi spiego meglio, andando a stampare i valori memorizzati con la printf, oltre ai valori che io ho messo, me ne escono anche altri che sono percorsi di file e cartelle, variabili di windows....

Eccovi il mio codice:

Codice:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CHAR 30

typedef int BOOL;

#define FALSE 0
#define TRUE !FALSE



typedef struct _rubrica
{
	int id;
	char cognome[MAX_CHAR];
	char nome[MAX_CHAR];
	char numero[MAX_CHAR];
	struct _rubrica *prev;
	struct _rubrica *next;
} rubrica;

typedef struct _lista
{
	rubrica *primo;
	rubrica *ultimo;
} lista;

int menu();
void aggiungi();
void rimuovi();
void visualizza();
void aggiungi_dopo(rubrica *r1, rubrica *r2);
void raccogli_dati(rubrica *r);
rubrica *ottieni_ultimo();
void trim(char *s1);
void aggiungi_inizio(rubrica *r);
void aggiungi_prima(rubrica *r1, rubrica *r2);
void stampa_nodo(rubrica *r);
rubrica *cerca(const int id);
void rimuovi_nodo(rubrica *r);

int rubriche_totali;

lista *list = NULL;

int main (void)
{
	
	void (*f[2])(void);
	int scelta;
	list = malloc(sizeof(lista));
	if (list != NULL)
	{
		list->primo = NULL;
		list->ultimo = NULL;
	}
	
	f[0] = aggiungi;
	f[1] = rimuovi;
	f[2] = visualizza;
	
	printf("RUBRICA 0.1\n");
	scelta = menu();
	while (scelta)
	{
		if (scelta > 3)
		{
			scelta = menu();
			continue;
		}
		f[scelta - 1]();
		scelta = menu();
	}
	system("PAUSE");
	return 0;
}

int menu ()
{
	int ret;
	printf("SELEZIONARE OPZIONE:\n1. Aggiungi\n2. Cancella\n3. Visualizza tutto\n0.Esci\n=> ");
	scanf("%d", &ret);
	printf("\n");
	return ret;
}

rubrica *ottieni_ultimo()
{
	return list->ultimo;
}

void trim(char *s1)
{
    while (TRUE)
    {
        if (*s1 == '\n')
        {   
            *s1 = '\0';
            break;
        }
        s1++;
    }
}

void raccogli_dati(rubrica *r)
{
	char cognome[MAX_CHAR];
	char nome[MAX_CHAR];
	char numero[MAX_CHAR];
	printf("inserire cognome:\n");
	fflush(stdin);
	fgets(cognome, sizeof(cognome), stdin); 
	trim(cognome);
	printf("inserire nome:\n");
	fflush(stdin);
	fgets(nome, sizeof(nome), stdin); 
	trim(nome);
	printf("inserire numero:\n");
	fflush(stdin);
	fgets(numero, sizeof(numero), stdin); 
	trim(numero);
	r->id = rubriche_totali;
	strncpy(r->cognome, cognome, strlen(cognome));
	strncpy(r->nome, nome, strlen(nome));
	strncpy(r->numero, numero, strlen(numero));
	r->prev = NULL;
	r->next = NULL;
	rubriche_totali++;
}




void aggiungi()
{
	rubrica *curr;
	rubrica *r1;
	r1 = malloc(sizeof(rubrica));
	if (r1 != NULL)
	{
		raccogli_dati(r1);
		curr = ottieni_ultimo();
		if (curr)
		{
			aggiungi_dopo(curr, r1);
		}
		else
		{
			aggiungi_inizio(r1);
		}
	}
	printf("aggiunto con id %d\n", rubriche_totali - 1);
}

void aggiungi_inizio(rubrica *r)
{
	if (list->primo)
	{
		aggiungi_prima(list->primo, r);
	}
	else
	{
		list->primo = r;
		list->ultimo = r;
		r->prev = NULL;
		r->next = NULL;
	}
}

void aggiungi_prima(rubrica *r1, rubrica *r2)
{
	r2->prev = r1->prev;
	r2->next = r1;
	if (r1->prev)
	{
		r2->prev->next = r2;
	}
	else
	{
		list->primo = r2;
	}
}

void aggiungi_dopo(rubrica *r1, rubrica *r2)
{
	r2->next = r1->next;
	r1->next = r2;
	r2->prev = r1;
	if (r2->next)
	{
		r2->next->prev = r2;
	}
	else
	{
		list->ultimo = r2;
	}
}
	
rubrica *cerca(const int id)
{
	rubrica *r1;
	r1 = ottieni_ultimo();
	int index;
	for (index = 0; index < rubriche_totali; index++)
	{
		if (r1->id == id)
		{
			return r1;
		}
		else
		{
			r1 = r1->prev;
		}
	}
	return NULL;
}

void rimuovi() 
{
	int id;
	rubrica *r1;
	printf("Inserisci l'id della rubrica da rimuovere: ");
	fflush(stdin);
	scanf("%d", &id);
	r1 = cerca(id);
	if (r1 != NULL)
	{
		rimuovi_nodo(r1);
	}
	else
	{
		printf("valore inesistente\n");
	}
}

void rimuovi_nodo(rubrica *r)
{
	if (r->prev)
	{
		r->prev->next = r->next;
	}
	else
	{
		list->primo = r->next;
	}
	
	if (r->next)
	{
                r->next->id -= 1;
		r->next->prev = r->prev;
	}
	else
	{
		list->ultimo = r->prev;
	}
	free(r);
}



void visualizza() 
{
	int id;
	rubrica *r1;
	printf("Inserisci l'id della rubrica da visualizzare: ");
	fflush(stdin);
	scanf("%d", &id);
	r1 = cerca(id);
	if (r1 != NULL)
	{
		stampa_nodo(r1);
	}
	else
	{
		printf("valore inesistente\n");
	}
}

void stampa_nodo(rubrica *r)
{
	printf("cognome=%s\nnome=%s\nnumero=%s\n", r->cognome, r->nome, r->numero);
}
Potreste aiutarmi per favore a capire dove stà l'errore ? Grazie in anticipo

Ultima modifica di Gr1ph00n : 12-06-2009 alle 20:32.
Gr1ph00n è offline   Rispondi citando il messaggio o parte di esso
Old 12-06-2009, 22:58   #2
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1180
Ho dato una scorsa veloce... ma permettimi una domanda: perche' usi "strncpy" con la lunghezza della stringa sorgente?

Codice:
	strncpy(r->cognome, cognome, strlen(cognome));
	strncpy(r->nome, nome, strlen(nome));
	strncpy(r->numero, numero, strlen(numero));
Basterebbe una semplice "strcpy".

Con "strncpy" se vuoi copiare anche il carattere nullo devi aggiungere un +1 alla lunghezza... dato che non e' aggiunto implicitamente.

Come hai fatto tu non "termini" la stringa... ed e' forse questo il motivo dei caratteri non desiderati.

Ultima modifica di BrutPitt : 12-06-2009 alle 23:10. Motivo: maggiore chiarezza
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 12-06-2009, 23:14   #3
Gr1ph00n
Member
 
Iscritto dal: Oct 2006
Messaggi: 67
Si, hai ragione, era quello l'errore, o meglio dovevo usare la sizeof al posto della strlen per non avere problemi, comunque ora ho risolto. Grazie per la risposta
Gr1ph00n è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Warhorse Studios colpita da un grave att...
MX Master 4, arriva l'edizione speciale ...
Kali Linux 2026.3 porta la caccia alle r...
Oracle si affida a OpenAI: ChatGPT e Cod...
Kaspersky punta su IA e servizi gestiti ...
Già sfruttata la falla Brotli che...
Potrebbe essere stato scoperto un nuovo ...
Claude Code, il prompt per scovare telec...
Palit e GALAX smentiscono le voci sulla ...
Fujifilm annuncia la Instax Mini Evo 2, ...
Tailscale chiude le falle SSH verso root...
Il tuo Galaxy laggava nei giochi? Samsun...
Arrivano i nuovi Amazon Echo: prezzi da ...
Il nuovo pickup elettrico Ford può alime...
Opera WebAI: così l'intelligenza artific...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:24.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v