Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259

    [C] Inserire parole o numeri di lunghezza prestabilita

    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?

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    No ma c'è la possibilità di ignorare gli altri caratteri immessi, la funzione fgets considera al massimo n caratteri e gli altri li ignora.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259
    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?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    20
    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...

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259
    Quindi se io ad esempio ho un array
    codice:
    NOME[15]
    e facendo una
    codice:
    fgets(nome,14,stdin)
    come faccio ad evitare cio?
    Posso mettere la lettura tramite getchar all'interno di un for con massimo 14 cicli e bloccarlo se rieve in ingresso il carattere \n?

  7. #7
    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.
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2011
    residenza
    Firenze
    Messaggi
    259
    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;
    }

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.