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

    scanf e risultati assurdi!

    Codice PHP:
    int main(){
        
        
    char *buff;
        
    scanf("%s"buff);
        
    printf("E' stato immesso: %s"buff);
        return 
    0;

    questo codice mi da "bus error"

    Codice PHP:
    int main(){
         
    char car;     
            while(
    car != '1'){         
                
    printf("1=login, 2= registrati");     
                
    scanf("%c", &car); 
                
    printf("%c\n"car);     }     
           return 
    0; } 
    mentre questo mi produce questo risultato:
    1=login, 2= registrati5
    5
    1=login, 2= registrati

    1=login, 2= registrati[aspetta input]
    e quindi scrive il messaggio per la guida all'imissione dell'input 1 volta in piu di quello che dovrebbe effettivamente fare..

    ma qualcuno mi sa spiegare dove sbaglio?!?!?!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466

    Re: scanf e risultati assurdi!

    Originariamente inviato da the darkness
    ... questo codice mi da "bus error"
    E' normale ... Utilizzi un puntatore senza allocare lo spazio per la stringa ...

    ... mentre questo mi produce questo risultato:
    1) devi inizializzare il valore car all'inizio

    char car = '0';

    e soprattutto

    2) devi svuotare il buffer dopo l'input con la scanf

    scanf("%c", &car);
    while(!getchar()) ;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    scusami, mi puoi spiegare mejo la questione del puntatore e anche quella del char?
    GRAZIE

  4. #4
    char car = '0';
    while(car != '1'){
    printf("1=login, 2= registrati");
    scanf("%c", &car);
    while(!getchar()) ;
    printf("%c\n", car);
    }
    e comunque nemmeno cosi funziona perchè dopo un po di input sbagliati che metto, non mi legge più 1 come input corretto..

  5. #5
    e per giunta se metto :
    while(car != '1' || car != '2')

    non legge nessuno dei due input come esatti...io non so se sta cosa è normale!!!

  6. #6
    scusate se aggiungo post ma....
    while(car != 1 ){
    printf("1=login, 2= registrati");
    scanf("%d", &car);
    printf("%d\n", car);
    while(!getchar()) ;
    }

    forse così va bene?
    Però ho notato che se immetto per esempio "asdfsd" il programma è come se avesse ricevuto diverse immissioni e non una sola, ergo mi chiedo se il getchar funziona come dovrebbe..
    anche se ho notato che eliminando il getchar e nell'input immetto anche una singola lettera, va in un ciclo infinito...ma è possibile sta cosa??
    Non dovrebbe leggere che quella lettera non è un decimale e dunque saltarla e ricominciare normalmente dal while?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Il codice potrebbe essere

    codice:
       char car='0';
    
       while(car != 1 )
       {
          printf("1=login, 2= registrati");
    
          scanf("%c", &car);
          fflush(stdin);
    
          if(car=='1' || car=='2')
             printf("%c\n", car);
          else
             printf("non valido\n");
       }
    Per quanto riguarda il puntatore, ti consiglio di rivedere le nozioni di base circa l'utilizzo dei puntatori e l'allocazione dinamica della memoria tramite i puntatori.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Qualche miglioramento stupido...

    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    int main()
    { 
      char car;      
      while(car!='1' && car!='2')
      {          
        printf("Menu:\n1) login\n2) registrati\n");      
        scanf("%c", &car); 
        fflush(stdin);
        if(car!='1' && car!='2')printf("Input non valido\n\n");
      }      
      return 0;
    }
    Il tuo problema era che scanf guarda se il buffer standard di input (stdin) è vuoto, se si chiede l'input all'utente, altrimente legge dal buffer. Il tuo buffer lo riempivi con "5\n", perciò prima leggeva il carattere 5, ed il ciclo successivo si ritrovava l'invio...

    per quanto riguarda l'allocazione dinamica della memoria:
    codice:
    int main()
    {      
      char *buff=malloc(256); //Allocazione di 256 byte/caratteri
      scanf("%s", buff); 
      printf("E' stato immesso: %s", buff); 
      return 0; 
    }
    Ma attenzione a non inserire stringhe più grandi di 255 caratteri (più la terminazione della stringa) per non incappare in buffer overflow

    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  9. #9
    scasa, ma mi sono dimenticato di mettere, prima di return 0;
    free(buff); ri
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: scanf e risultati assurdi!

    Originariamente inviato da the darkness
    codice:
    int main(){
    	
    	char *buff;
    	scanf("%s", buff);
    	printf("E' stato immesso: %s", buff);
    	return 0;
    }
    questo codice mi da "bus error"
    La questione del puntatore è semplice: essendo *buff un puntatore a char, non occupa nessuna locazione di memoria ma ne punta solo una. Quando provi ad immettere da tastiera una stringa, supponiamo "ciao", tu dovresti occupare uno spazio di 5 byte, ossia 1 byte per c, uno per i, 1 per a, 1 per o e un ultimo per \0, terminatore; il punto è che se non allochi questo spazio in memoria ti sarà impossibile andarci a scrivere dentro una stringa: sarebbe come voler mettere un oggetto in una scatola che non c'è. La "scatola" te la devi "creare". Come? Con l'allocazione dinamica, ossia tramite le funzioni malloc e calloc.

    buff = (char *)malloc(5);

    alloca 5 byte in memoria per la stringa buff. I valori rimangono "sporchi", cioè non vengono inizializzati a 0, cosa che invece succede con

    buff = (char *)calloc( 5, sizeof(char) );

    che oltre ad allocare 5 byte in memoria per la stringa, inizializza anche tali locazioni a 0.

    Fatto questo puoi finalmente immettere da tastiera la stringa con l'istruzione scanf("%s", buff); oppure gets(buff);

    Quale delle due funzioni precedenti usare? Puoi usare anche la prima (malloc) perché nel tuo caso non hai bisogno di azzerare le locazioni di memoria.

    Sia malloc che calloc sono definite in stdlib.h, se vuoi saperne di più puoi googlare un po'

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.