Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C] Puntatore che scompare

    Salve, sto trattando le liste e sto effettuando degli "allenamenti" su di esse..
    ho scritto questo programino che crea una lista a descrizione dell'utente:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct utente
    {
    	int id;
    	struct utente *next;
    };
    
    int main(void)
    {
    	char 	ris;
    	struct utente *testa, *variante;
    
    	testa = malloc(sizeof(struct utente));
    	printf("Inserisci l'ID dell'utente: ");	scanf("%d", &testa->id);
    	variante = testa;
    	
    	printf(" - Altro utente da inserire? - ");	scanf("%s",&ris);
    	while( ris != 'n')
    	{
    		variante->next = malloc(sizeof(struct utente));
    		printf("Inserisci l'ID dell'utente: "); scanf("%d", &variante->next->id);
    		variante->next->next= NULL;
    		variante = variante->next;
    
    		printf(" - Altro utente da inserire? - ");
    		scanf("%s",&ris);	
    	}	
    	
    	printf("%d", testa->id);
    	printf("\n programma terminatao \n");
    
    	return 0;
    }
    l'intento è avere "testa" con il quale posso arrivare a tutti i membri della mia lista, ma il problema che non riesco a risolvere, è perché, "testa" scompare quando entro nel while.. anche se non faccio operazioni..

    quando faccio

    codice:
    printf("%d", testa->id);
    il risultato è sempre 0

    anche se il while è cosi formato:

    codice:
    ....
    	while( ris != 'n')
    	{
    		printf("%d", testa->id);
    
    		printf(" - Altro utente da inserire? - ");
    		scanf("%s",&ris);	
    	}	
    ......

    dove sbaglio?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Innanzitutto quando leggi da tastiera un dato di tipo char devi utilizzare il codice di formato %c e non %s, quindi sostituiscilo nelle scanf() dove leggi il valore di ris.
    Fatto questo, ci potrebbero essere i soliti problemi generati dalle istruzioni di input bufferizzate... quindi aggiusta il codice così

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct utente
    {
    	int id;
    	struct utente *next;
    };
    
    int main(void)
    {
    	char 	ris;
    	struct utente *testa, *variante;
    
    	testa = malloc(sizeof(struct utente));
    	printf("Inserisci l'ID dell'utente: ");	scanf("%d", &testa->id);
    
    	variante = testa;
    	
    	printf(" - Altro utente da inserire? - ");	scanf("%c",&ris);
            while ( getchar() != '\n' );
    	while( ris != 'n')
    	{
    		variante->next = malloc(sizeof(struct utente));
    		printf("Inserisci l'ID dell'utente: "); scanf("%d", &variante->next->id);
                    while ( getchar() != '\n' );
    		variante->next->next= NULL;
    		variante = variante->next;
    
    		printf(" - Altro utente da inserire? - ");
    		scanf("%c",&ris);
    	}	
    	
    	printf("%d", testa->id);
    	printf("\n programma terminatao \n");
    
    	return 0;
    }
    oppure con

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct utente
    {
    	int id;
    	struct utente *next;
    };
    
    int main(void)
    {
    	char 	ris;
    	struct utente *testa, *variante;
    
    	testa = malloc(sizeof(struct utente));
    	printf("Inserisci l'ID dell'utente: ");	scanf("%d", &testa->id);
    
    	variante = testa;
    	
    	printf(" - Altro utente da inserire? - ");	scanf("%c%*c",&ris);
    
    	while( ris != 'n')
    	{
    		variante->next = malloc(sizeof(struct utente));
    		printf("Inserisci l'ID dell'utente: "); scanf("%d%*c", &variante->next->id);
    
    		variante->next->next= NULL;
    		variante = variante->next;
    
    		printf(" - Altro utente da inserire? - ");
    		scanf("%c",&ris);
    	}	
    	
    	printf("%d", testa->id);
    	printf("\n programma terminatao \n");
    
    	return 0;
    }
    le aggiunte in rosso nei due codici servono entrambe a "pulire" il buffer di input da tastiera dal carattere di newline che spesso dà problemi. Potresti usare anche fflush(stdin) ma non funzionerebbe su tutti i sistemi.
    every day above ground is a good one

  3. #3
    YuYevon ho usato il %s siccome avevo un anomalia, e cioè quando uso %s nella printf non mi si ferma alle condizioni, ma eseguè tutto..

    al momento non posso provare.. ma per il problema che ho nella variabile "testa" che mi scompare, risolvo con queste modifiche?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da gio_gio88
    YuYevon ho usato il %s siccome avevo un anomalia, e cioè quando uso %s nella printf non mi si ferma alle condizioni, ma eseguè tutto..
    Non ho capito cosa vuoi dire, spiega meglio.

    Originariamente inviato da gio_gio88
    al momento non posso provare.. ma per il problema che ho nella variabile "testa" che mi scompare, risolvo con queste modifiche?
    Non è che testa "scompare" (non significa molto...), semplicemente con il programma scritto in quel modo (cioè nella versione originaria che hai postato tu) hai problemi con le istruzioni di input da tastiera che ti azzerano il campo id di testa, ma con le modifiche che ti ho suggerito non dovresti avere problemi. Appena puoi provarlo, vedrai se va bene.
    every day above ground is a good one

  5. #5
    Originariamente inviato da YuYevon
    Non ho capito cosa vuoi dire, spiega meglio
    codice:
    printf(" - Altro utente da inserire? - ");	scanf("%c",&ris);
    	while( ris != 'n')
    	{
    		variante->next = malloc(sizeof(struct utente));
    		printf("Inserisci l'ID dell'utente: "); scanf("%d", &variante->next->id);
    		variante->next->next= NULL;
    		variante = variante->next;
    
    		printf(" - Altro utente da inserire? - ");
    		scanf("%c",&ris);	
    	}	
    	
    	printf("%d", testa->id);
    	printf("\n programma terminatao \n");
    se scrivo il codice in questo modo, mi salta il controllo del while, andandomi direttamente a:

    codice:
    printf("\n programma terminatao \n");

    Originariamente inviato da YuYevon
    Non è che testa "scompare" (non significa molto...), semplicemente con il programma scritto in quel modo (cioè nella versione originaria che hai postato tu) hai problemi con le istruzioni di input da tastiera che ti azzerano il campo id di testa, ma con le modifiche che ti ho suggerito non dovresti avere problemi. Appena puoi provarlo, vedrai se va bene.
    ok, grazie

  6. #6
    YuYevon ho provato la tua seconda soluzione ma niente, stesso problema, non riesco a capire come mai....

    nelle printf se metto %c mi salta il controllo.. puoi provare se fa lo stesso a te?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da gio_gio88
    YuYevon ho provato la tua seconda soluzione ma niente, stesso problema, non riesco a capire come mai....
    E con la seconda? E' strano perché a me funzionano entrambe... quale compilatore stai usando e su quale sistema?

    Originariamente inviato da gio_gio88
    nelle printf se metto %c mi salta il controllo.. puoi provare se fa lo stesso a te?
    nella scanf() forse intendevi dire... comunque ti ripeto a me vanno bene entrambe le soluzioni. Magari può essere utile che posti un esempio completo di esecuzione come la ottieni tu, cioè proprio ciò che ti esce scritto nella console dall'avvio del programma fino alla terminazione.
    every day above ground is a good one

  8. #8
    Originariamente inviato da YuYevon
    E con la seconda? E' strano perché a me funzionano entrambe... quale compilatore stai usando e su quale sistema?



    nella scanf() forse intendevi dire... comunque ti ripeto a me vanno bene entrambe le soluzioni. Magari può essere utile che posti un esempio completo di esecuzione come la ottieni tu, cioè proprio ciò che ti esce scritto nella console dall'avvio del programma fino alla terminazione.
    Ciao, scusami se rispondo ora.
    Il codice è questo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct utente
    {
    	int id;
    	struct utente *next;
    };
    
    int main(void)
    {
    	char 	ris;
    	struct utente *testa, *variante;
    
    	testa = malloc(sizeof(struct utente));
    	printf("Inserisci l'ID dell'utente: ");	scanf("%d", &testa->id);
    	variante = testa;
    	
    	printf(" - Altro utente da inserire? - ");	scanf("%c",&ris);
    	while( ris != 'n')
    	{
    		variante->next = malloc(sizeof(struct utente));
    		printf("Inserisci l'ID dell'utente: "); scanf("%d", &variante->next->id);
    		variante->next->next= NULL;
    		variante = variante->next;
    
    		printf(" - Altro utente da inserire? - ");
    		scanf("%c",&ris);	
    	}	
    	
    	printf("%d", testa->id);
    	printf("\n programma terminatao \n");
    
    	return 0;
    }
    al terminale ciò che ho è questo:

    [Giovanni@gionet Programmi in C]$ gcc work.c
    [Giovanni@gionet Programmi in C]$ ./a.out
    Inserisci l'ID dell'utente: 34
    - Altro utente da inserire? - Inserisci l'ID dell'utente: 44
    - Altro utente da inserire? - Inserisci l'ID dell'utente:

    come vedi, non mi fa inserire l'input alla domanda "Altro utente da inserire?" e quindi non potendo uscire dal ciclo..
    il SO utilizzato è Fedora.. ho un problema di macchina?

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Mi sembrava di averti già suggerito la soluzione...

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct utente
    {
    	int id;
    	struct utente *next;
    };
    
    int main(void)
    {
    	char 	ris;
    	struct utente *testa, *variante;
    
    	testa = malloc(sizeof(struct utente));
    	printf("Inserisci l'ID dell'utente: ");	scanf("%d", &testa->id);
    
            while ( getchar() != '\n' );
    
    	variante = testa;
    	
    	printf(" - Altro utente da inserire? - ");	scanf("%c",&ris);
    
            while ( getchar() != '\n' );
    
    	while( ris != 'n')
    	{
    		variante->next = malloc(sizeof(struct utente));
    		printf("Inserisci l'ID dell'utente: "); scanf("%d", &variante->next->id);
    
                    while ( getchar() != '\n' );
    
    		variante->next->next= NULL;
    		variante = variante->next;
    
    		printf(" - Altro utente da inserire? - ");
    		scanf("%c",&ris);
    
                    while ( getchar() != '\n' );
    	}	
    	
    	printf("%d", testa->id);
    	printf("\n programma terminatao \n");
    
    	return 0;
    }
    every day above ground is a good one

  10. #10
    si YuYevon, ma volevo capire quale fosse il problema della tua prima soluzione, problema che riscontro frequentemente.. riesci a dare una possibile soluzione?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.