2017-04-11 7 views
0
#include <stdio.h> 
#include <stdlib.h> 

int main(void) { 
    int i = 0; 
    char c, *input; 
    input = (char *) malloc(sizeof(char)); 

    if(input == NULL) { 
    printf("NOT ENOUGH SPACE!"); 
    exit(1); 
    } 

    printf("Input a string, press ENTER when done: "); 

    while((c = getchar()) != '\n') { 
    realloc(input, (sizeof(char))); 
    input[i++] = c; 
    } 

    input[i] = '\0'; 
    printf("\nYou've entered the string: %s\n", input); 
} 

Das obige Code-Snippet funktioniert gut für kleine Eingabe. Aber es scheitert immer dann, wenn die bereitgestellte Eingabe groß ist. Entweder gibt es einen Laufzeitfehler oder einen Segmentierungsfehler. Bei der Neuzuweisung von Speicherplatz ist möglicherweise ein Fehler aufgetreten. Ich möchte im Grunde ein Zeichen-Array dynamisch vom Benutzer, d. H. Ohne die Kapazität der Eingabe zu erwähnen, kann der Benutzer direkt in beliebiger Größe von Zeichen-Array setzen.Laufzeitfehler in dynamischem Zeichenarray

Antwort

2

Die hier Logik ist falsch:

while((c = getchar()) != '\n') { 
     realloc(input, (sizeof(char))); 
     input[i++] = c; 
    } 

Sie sind eigentlich nicht die Größe des Puffers zu erhöhen, und Sie sind auch das Ergebnis der realloc verwerfen.

Versuchen:

while ((c = getchar()) != '\n') { 
    // Note: you need one extra character for the terminator, so for the 
    // first char, when `i` is 0, then you need room for two `char`s in 
    // the buffer - one for the first input character and one for the 
    // terminator. And so on... 
    char * temp = realloc(input, i + 2); // NB: realloc can, and sometimes does, fail 
    if (temp == NULL) // if realloc failed then exit program 
     exit(1); 
    input = temp;  // otherwise update input... 
    input[i++] = c; 
    } 


Auch, weil Sie immer auf jedes Zeichen zu rufen realloc werden (was sehr ineffizient ist, nebenbei bemerkt, aber es funktioniert), ist diese Zeile:

input = (char *) malloc(sizeof(char)); 

input = NULL; 
:

(die nicht eine Besetzung haben sollte, BTW, da diese C ist, nicht C++) kann nur sein,


Und ein letzter Fehler:

char c; 

sollte sein:

int c; 

sonst Ihre while Schleife kann nie enden, da EOF nur richtig als int dargestellt werden.


Also das letzte feste Programm sollte etwa wie folgt aussehen:

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

int main(void) { 
    int i = 0; 
    int c; 
    char * input = NULL; 

    printf("Input a string, press ENTER when done: "); 

    while ((c = getchar()) != '\n') { 
     // Note: you need one extra character for the terminator, so for the 
     // first char, when `i` is 0, then you need room for two `char`s in 
     // the buffer - one for the first input character and one for the 
     // terminator. And so on... 
     char * temp = realloc(input, i + 2); // NB: realloc can, and sometimes does, fail 
     if (temp == NULL) // if realloc failed then exit program 
      exit(1); 
     input = temp;  // otherwise update input... 
     input[i++] = c; 
    } 

    input[i] = '\0'; 
    printf("\nYou've entered the string: %s\n", input); 

    return 0; 
} 
+0

Das ist großartig Sir. Aber ich bekomme immer noch eine TLE. Nach dem Ersetzen dieses Ausschnitts _while ((c = getchar())! = '\ N') {_ _ realloc (Eingabe, (sizeof (char))); _ _ Eingabe [i ++] = c; _ _} _ mit Ihren. –

+0

Haben Sie alle obigen drei Fehler behoben? –

+0

Nein, grundsätzlich habe ich nur die eine in der while-Schleife angewendet. Sollte ich alle von ihnen anwenden? –