2016-06-15 14 views
0

Hi ich versuche zu lesen Benutzereingabe von "unbegrenzte" Länge in ein Char-Array. Es funktioniert gut für kürzere Strings, aber für mehr als 30 Zeichen stürzt das Programm ab. Warum passiert das und wie kann ich das beheben?C: String in dynamisches Array lesen

#include <stdio.h> 
#include <stdlib.h> 

char* read_string_from_terminal()//reads a string of variable length and returns a pointer to it 
{ 
    int length = 0; //counts number of characters 
    char c; //holds last read character 
    char *input; 

    input = (char *) malloc(sizeof(char)); //Allocate initial memory 

    if(input == NULL) //Fail if allocating of memory not possible 
    { 
     printf("Could not allocate memory!"); 
     exit(EXIT_FAILURE); 
    } 

    while((c = getchar()) != '\n') //until end of line 
    { 
     realloc(input, (sizeof(char))); //allocate more memory 
     input[length++] = c; //save entered character 
    } 

    input[length] = '\0'; //add terminator 
    return input; 

} 

int main() 
{ 
    printf("Hello world!\n"); 
    char* input; 
    printf("Input string, finish with Enter\n"); 
    input = read_string_from_terminal(); 
    printf("Output \n %s", input); 
    return EXIT_SUCCESS; 
} 
+5

'realloc (Eingang, (sizeof (char))); // reserviere mehr Speicher' Dieser Kommentar ist falsch. Durch die Neuzuweisung von 1 Byte zu 1 Byte wird kein Speicher mehr zugewiesen. Das zu ignorieren, was von 'realloc()' zurückgegeben wird, ist ebenfalls schlecht. – MikeCAT

+2

Vergessen Sie auch nicht, Platz für den Terminator zu reservieren. – MikeCAT

+0

Das scheint zu funktionieren: 'realloc (input, (sizeof (char) * length + 1)); ' – t1msu

Antwort

0

realloc(input, (sizeof(char))); //allocate more memory ordnet nur 1 char. Nicht 1 mehrchar. @MikeCAT

(sizeof(char)*length+1) ist semantisch falsch. Sollte (sizeof(char)*(length+1)) sein, aber seit sizeof (char) == 1, macht es keinen funktionalen Unterschied.

Benötigen Sie Platz für das Nullzeichen. @MikeCAT

Sollte für Reallokationsfehler testen.

char c ist nicht ausreichend, um alle 257 verschiedenen Antworten von getchar() zu unterscheiden. Verwenden Sie int. getchar() kann EOF zurückgeben. @Andrew Henle

Minor: Besser zu verwenden size_t für Array-Indizes als int. int vielleicht zu eng.

Am Ende Code muss, wie etwas zu tun ist:

size_t length = 0; 
char *input = malloc(1); 
assert(input); 
int c; 
... 
while((c = getchar()) != '\n' && c != EOF) { 
    char *t = realloc(input, length + 1); 
    assert(t); 
    input = t; 
    input[length++] = c; 
} 
... 
return input; 

int main(void) { 
    ... 
    input = read_string_from_terminal(); 
    printf("Output \n %s", input); 
    free(input); 
    return EXIT_SUCCESS; 
}  
+0

Auf eine Randnotiz sollte Code zurückgeben 'NULL' ist die allererste' getchar() 'gibt' EOF' zurück, um das aufrufende Code-Ende der Datei anzuzeigen. – chux