Comment lire un nombre illimité de caractères en C

Comment lire un nombre illimité de caractères dans une variable char* sans spécifier la taille?

Par exemple, disons que je veux lire l’adresse d’un employé qui peut également prendre plusieurs lignes.

    Vous devez commencer par “deviner” la taille que vous attendez, puis allouer un tampon aussi gros en utilisant malloc . Si cela s’avère trop petit, vous utilisez realloc pour redimensionner la mémoire tampon afin qu’elle soit un peu plus grande. Exemple de code:

     char *buffer; size_t num_read; size_t buffer_size; buffer_size = 100; buffer = malloc(buffer_size); num_read = 0; while (!finished_reading()) { char c = getchar(); if (num_read >= buffer_size) { char *new_buffer; buffer_size *= 2; // try a buffer that's twice as big as before new_buffer = realloc(buffer, buffer_size); if (new_buffer == NULL) { free(buffer); /* Abort - out of memory */ } buffer = new_buffer; } buffer[num_read] = c; num_read++; } 

    Ceci est juste une idée en tête, et pourrait (lire: sera probablement) contenir des erreurs, mais devrait vous donner une bonne idée.

    Il me suffisait de répondre à Ex7.1, page 330 de Beginning C, de Ivor Horton, 3ème édition. Il a fallu quelques semaines pour travailler. Permet la saisie de nombres flottants sans spécifier à l’avance le nombre de chiffres que l’utilisateur entrera. Stocke les nombres dans un tableau dynamic, puis imprime les nombres et la valeur moyenne. Utiliser Code :: Blocks avec Ubuntu 11.04. J’espère que ça aide.

     /*realloc_for_averaging_value_of_floats_fri14Sept2012_16:30 */ #include  #include  #define TRUE 1 int main(int argc, char ** argv[]) { float input = 0; int count=0, n = 0; float *numbers = NULL; float *more_numbers; float sum = 0.0; while (TRUE) { do { printf("Enter an floating point value (0 to end): "); scanf("%f", &input); count++; more_numbers = (float*) realloc(numbers, count * sizeof(float)); if ( more_numbers != NULL ) { numbers = more_numbers; numbers[count - 1] = input; } else { free(numbers); puts("Error (re)allocating memory"); exit(TRUE); } } while ( input != 0 ); printf("Numbers entered: "); while( n < count ) { printf("%f ", numbers[n]); /* n is always less than count.*/ n++; } /*need n++ otherwise loops forever*/ n = 0; while( n < count ) { sum += numbers[n]; /*Add numbers together*/ n++; } /* Divide sum / count = average.*/ printf("\n Average of floats = %f \n", sum / (count - 1)); } return 0; } /* Success Fri Sept 14 13:29 . That was hard work.*/ /* Always looks simple when working.*/ /* Next step is to use a function to work out the average.*/ /*Anonymous on July 04, 2012*/ /* http://www.careercup.com/question?id=14193663 */ 

    Pourquoi ne pas simplement mettre un tampon de 1 Ko (ou 4 Ko) sur la stack, y lire jusqu’à ce que vous trouviez la fin de l’adresse, puis allouer un tampon de taille correcte et y copier les données? Une fois que vous revenez de la fonction, le tampon de stack disparaît et vous n’avez qu’un seul appel à malloc .