Sto creando un progetto in linux+C quindi uso il compilatore gcc.
Esiste un modo per far si che all'immisione di una stringa la shell mi faccia inserire al massimo 10 lettere per esempio?
Sto creando un progetto in linux+C quindi uso il compilatore gcc.
Esiste un modo per far si che all'immisione di una stringa la shell mi faccia inserire al massimo 10 lettere per esempio?
No ma c'è la possibilità di ignorare gli altri caratteri immessi, la funzione fgets considera al massimo n caratteri e gli altri li ignora.
Quindi se io ho un array[10] e nella fgets inserisco che devono essere presi in considerazione soltanto i primi 9 che si inseriscono non rischio di avere un overflow?
Non so perchè ma mi prende in considerazione anche \n quando premo invio nella prossima immissione, risolto questo con un while che svuota il buffer. Poi un altro problema sempre inerente al titolo è il fatto che se inserisco una sfilza di caratteri (50 per sempio) il programma si blocca dicendo segmentation fault. Questo me lo fa anche con la fgets! Se non trovo una soluzione devo solo sperare che il professore non inserisca troppi caratteri.
bè, questo accade perchè quello che scrivi è troppo lungo e finisce per occupare la zona di memoria riservata ad altre variabili, ad esempio. A volte basta anche solo cambiare l'ordine in cui inizializzi le variabili... Ovviamente meglio lavorare sul codice...
Quindi se io ad esempio ho un array
e facendo unacodice:NOME[15]
come faccio ad evitare cio?codice:fgets(nome,14,stdin)
Posso mettere la lettura tramite getchar all'interno di un for con massimo 14 cicli e bloccarlo se rieve in ingresso il carattere \n?
Questo non è mica normale, la fgets memorizza nel buffer al massimo il numero di caratteri che specifichi; posta il codice che ti dà questo problema.Originariamente inviato da Fix87
Non so perchè ma mi prende in considerazione anche \n quando premo invio nella prossima immissione, risolto questo con un while che svuota il buffer. Poi un altro problema sempre inerente al titolo è il fatto che se inserisco una sfilza di caratteri (50 per sempio) il programma si blocca dicendo segmentation fault. Questo me lo fa anche con la fgets! Se non trovo una soluzione devo solo sperare che il professore non inserisca troppi caratteri.
Amaro C++, il gusto pieno dell'undefined behavior.
codice:int autenticazione(){ int a='n',b=0; char username[21], password[21], usernameT[21], passwordT[21]; FILE*r=fopen("credenziali.txt","r"); do{ if(b==0){ printf("\nPrimo tentavivo!\n"); int ch; while((ch=getchar())!='\n' && ch!=EOF); } if(b==1){ printf("\nSecondo tentativo!\n"); int ch; while((ch=getchar())!='\n' && ch!=EOF); } if(b==2){ printf("\nTerzo ed ultimo tentativo!\n"); int ch; while((ch=getchar())!='\n' && ch!=EOF); } printf("\nInserisci username: "); fgets(username,20,stdin); printf("Inserisci password: "); fgets(password,20,stdin); while(!feof(r)){ if(fscanf(r,"%s%s",usernameT,passwordT)==2){ if((strcmp(usernameT,username)==0)&(strcmp(passwordT,password)==0)){ printf("\n\nAutenticazione effettuata!\n\n\n"); a='s'; break; } } } if(a=='n'){ printf("\n\nNome utente e password inesistenti!\n\n"); fseek(r,0,SEEK_SET); b++; } else if(a=='s'){ presentazione(); menu(); break; } }while(b<3); if(b==3) printf("\nMi dispiace ma hai superato il numero di tentativi, arrivederci!\n\n\n\n"); fclose(r); return 0; }