Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    [C] Il programma mi prende in giro...

    Ciao a tutti,
    ho scritto il seguente programma
    codice:
    void reverse( FILE *fp, char *fileName )
    {
    	char *string = (char*) malloc( 100 * sizeof(char) );
    	int counter = 0;
    	
    	while( fgets( string, 100, fp ) != NULL )
    		++counter;
    	
    	char **array = (char**) malloc( counter * sizeof(char*) );
    
    	fclose( fp );
    	
    	fp = fopen( fileName, "r" );
    	
    	int i = 0;
    	int aux = counter;
    	while( fgets( string, 100, fp ) )
    	{
    		array[--counter] = string;
    		printf( "%s\n", array[counter] );
    	}
    	
    	for( i = 0; i < aux; i++ )
    		printf( "%s\n", array[i] );
    }
    che dovrebbe memorizzare le stringhe in un array e poi stamparle in senso inverso.
    Le memorizzo direttamente in senso invertito e poi stampo l'array costruito, come potete vedere nei due cicli ho messo 2 printf e, la prima stampa correttamente l'elemento inserito array[counter] mentre il secondo ciclo mi stampa sempre l'ultima stringa letta, come e possibile ?!?!?!

    Spero che qualcuno sappia aiutarmi, provatelo pure il main e' cortissimo

    codice:
    int main( int argc, char** argv )
    {
    	
    	FILE *fp;
    	if( (fp = fopen( *(argv+1), "r")) == NULL)
    	{
    		printf( "Non sono riuscito ad aprire il file\n" );
    		return -1;
    	}
    	
    	reverse( fp, *(argv+1) );
    	
    	return 1;
    }
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    117
    guarda che è normale, xkè tu hai un'array di puntatori a stringa e l'assegnazione la fai così:

    codice:
    array[--counter] = string;
    quindi tutti gli elementi di array puntano tutti a string, che ogni volta viene modificato. quindi alla fine punteranno tutti a string che sarà l'ultima stringa letta. Dovrebbe essere:

    codice:
    void reverse( FILE *fp, char *fileName )
    {
    	char *string = (char*) malloc( 100 * sizeof(char) );
    	int counter = 0;
    	
    	while( fgets( string, 100, fp ) != NULL )
    		++counter;
    	
    	char **array = (char**) malloc( counter * sizeof(char*) );
            int i;
            for (i = 0; i < counter; i++)
                  array[i] = (char *)malloc(100 * sizeof(char));
            
    	fclose( fp );
    	
    	fp = fopen( fileName, "r" );
    	
    	i = 0;
    	int aux = counter;
    	while( fgets( string, 100, fp ) )
    	{
    		strcpy(array[--counter],string);
    		printf( "%s\n", array[counter] );
    	}
    	
    	for( i = 0; i < aux; i++ )
    		printf( "%s\n", array[i] );
    }
    non l'ho fatto girare, vedi un pò se funziona...

  3. #3

    Re: [C] Il programma mi prende in giro...

    codice:
    		array[--counter] = string;
    E' questo che secondo te "ti prende in giro!"
    Se ad ogni elemento dell'array assegni il riferimento a string e' logico che ti stampa sempre il solito riferimento alla variabile string.
    Perciò potresti usare una funzione tipo la
    codice:
    strcpy(array[--counter],string)
    che ti fa una copia del riferimento di string.
    P.S.: non ho testato il programma, ma sei sicuro che ti torni decrementare counter prima dell'assegnamento? Oppure devi decrementarlo dopo l'assegnamento?
    codice:
    strcpy(array[counter--],string)
    Controlla.

  4. #4
    Utente di HTML.it L'avatar di Poker1
    Registrato dal
    Jul 2002
    Messaggi
    479

    Re: Re: [C] Il programma mi prende in giro...

    [P.S.: non ho testato il programma, ma sei sicuro che ti torni decrementare counter prima dell'assegnamento? Oppure devi decrementarlo dopo l'assegnamento?
    codice:
    strcpy(array[counter--],string)
    Controlla.
    Bhe si perche' counter mi torna il numero di righe, e quindi io devo partire da counter-1
    Non riscrivere la ruota, usa le librerie.
    by Bjarne Stroustrup
    EIDON SOFT MEMBER

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.