C, lunghezza stringa da file

di il
14 risposte

C, lunghezza stringa da file

Il file contiene:
ciao
E il codice è:
int main()
{
	FILE *f = fopen("pal.txt", "r");
	if(f == NULL)
	{
		printf("Errore nell'apertura del file!\n");
		exit(1);
	}
	char buffer[100];
	int i = 0;
	while(!feof(f))
	{
		i = 0;
		fgets(buffer, 100, f);
		while(buffer[i] != '\0')
			i++;
		printf("i: %d\n", i);
	}
			
}
Che stampa i: 4 che è giusto.

Ora il mio file è:
ciao
mondo
il programma stampa:

i: 5
i: 5


che è sbagliato.

Centra qualcosa in carattere di fine riga?

14 Risposte

  • Re: C, lunghezza stringa da file

    L'errore è nel tuo algoritmo, perchè resetti i ad ogni riga!
  • Re: C, lunghezza stringa da file

    Perché scusa? Non è giusto resettarlo? Per ogni riga (stringa) che prelevo dal file devo riportare i a zero altrimenti come faccio a conoscere la dimensione di ogni stringa?

    Comunque, ho tolto il reset di i e non cambia.
  • Re: C, lunghezza stringa da file

    E' corretto azzerare i

    La fgets aggiunge un '\n' alla stringa letta. Quindi, se questo carattere è alla fine della stringa, devi considerare un carattere in meno e tutto torna.
  • Re: C, lunghezza stringa da file

    In questo modo intendi?
    int main()
    {
    	FILE *f = fopen("pal.txt", "r");
    	if(f == NULL)
    	{
    		printf("Errore nell'apertura del file!\n");
    		exit(1);
    	}
    	char buffer[100], *stringa;
    	int i = 0;
    	while(!feof(f))
    	{
    		fgets(buffer, 100, f);
    		i = 0;
    		while(buffer[i] != '\0')
    			i++;
    		i--;
    		printf("i: %d\n", i);
    	}
    }
    Così mi da lo stesso problemi.

    Se il file contiene solo "ciao" stampa i = 3, sbagliato.
    Se il file contiene:
    "ciao
    mondo"
    stampa:
    i: 4
    i: 4

    che è ancora sbagliato
  • Re: C, lunghezza stringa da file

    Infatti ti avevo scritto

    "se questo carattere è alla fine della stringa"

    Quindi devi controllare se c'è ...
  • Re: C, lunghezza stringa da file

    Ok, ora ci provo.

    "Quindi, se questo carattere è alla fine della stringa,.."

    con carattere ti riferisci a '\n' oppure al carattere i-esimo della stringa?

    Se fosse il primo caso:

    La fgets aggiunge un '\n' alla stringa letta, quindi non è automatico che ci sia quel carattere alla fine della stringa?

    Non ho capito questa cosa
  • Re: C, lunghezza stringa da file

    Mi riferisco al '\n'

    Se la fgets incontra un carattere '\n' termina l'input ma aggiunge il '\n' alla stringa letta.

    P.S. Perché utilizzi un contatore al posto della strlen per ottenere la lunghezza della stringa ??
  • Re: C, lunghezza stringa da file

    Perché non so se all'esame sarà possibile utilizzare strlen, poi anche per esercitarmi meglio sulle stringhe in generale.

    Comunque con strlen non mi funziona ugualmente. L'ho utilizzata male?
    
    int main()
    {
    	FILE *f = fopen("pal.txt", "r");
    	if(f == NULL)
    	{
    		printf("Errore nell'apertura del file!\n");
    		exit(1);
    	}
    	char buffer[100], *stringa;
    	int i = 0;
    	while(!feof(f))
    	{
    		fgets(buffer, 100, f);
                    i = 0;
    		i = strlen(buffer);
    		printf("i: %d\n", i);
    	}
    }
  • Re: C, lunghezza stringa da file

    Certe volte non so se mi spiego male io ...

    Ti ho detto di controllare se l'ultimo carattere della stringa è un '\n' e in questo caso di considerarlo. All'ultimo carattere ci arrivi facilmente con la strlen o con la tua i, MA IL CONTROLLO LO DEVI FARE.
  • Re: C, lunghezza stringa da file

    Vedi un pò se questa funzioncina ti può aiutare
    int mystrlen( char *str )
    {
       int cnt = 0;
       while(*str)
       {
           if( *str == '\n' )
              break; 
           cnt++;
           str++;
       }
       return cnt; 
    }
  • Re: C, lunghezza stringa da file

    Sarò io che non capisco.. Così?
    
    	while(!feof(f))
    	{
    		fgets(buffer, 100, f);
    		i = 0;
    		i = strlen(buffer);
    		if(buffer[i-1] == '\n')
    			i++;
    		printf("i: %d\n", i);
    		
    	}
  • Re: C, lunghezza stringa da file

    Semmai
          if(buffer[i-1] == '\n')
             i--;
    però io ci metterei anche un controllo che i sia maggiore di 0
    Potresti farne una funzione...
  • Re: C, lunghezza stringa da file

    1) che senso hanno due righe del tipo

    i = 0;
    i = ...

    Se il valore di i viene assegnato subito dopo che senso ha una linea prima azzerarlo?
    Non è importante ma bisogna ragionare su quello che si scrive ...

    2) okay, ora fai il controllo ... ma che fai .... se trovi il carattere '\n' aumenti i ??? Allora non hai proprio capito o non ragioni su quello che scrivi ... eppure è molto molto semplice ...

    Tu devi aumentare i come hai fatto fino ad ora ... alla fine del ciclo, se i è maggiore di zero, controlli l'elemento [i-1] della stringa e se è '\n' DIMINUISCI i di 1 ...

    Non ti scrivo pezzi di codice per farti ragionare ... devi arrivarci da solo a scrivere del codice così elementare ...
  • Re: C, lunghezza stringa da file

    oregon ha scritto:


    1) che senso hanno due righe del tipo
    i = 0;
    i = ...
    i = 0, mi sono dimenticato di toglierlo quando ho cambiato il ciclo di scansione per la dimensione della stringa con strlen.

    oregon ha scritto:


    2) okay, ora fai il controllo ... ma che fai .... se trovi il carattere '\n' aumenti i ???[/u] Allora non hai proprio capito o non ragioni su quello che scrivi ... eppure è molto molto semplice ...


    Più la seconda

    oregon ha scritto:


    Non ti scrivo pezzi di codice per farti ragionare ... devi arrivarci da solo a scrivere del codice così elementare ...


    Preferisco così infatti, grazie!
Devi accedere o registrarti per scrivere nel forum
14 risposte