2017-04-11 8 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); 
} 

上記のコードスニペットは、小さな入力に対してはうまく機能します。しかし、提供される入力が大きい場合は必ず失敗します。実行時エラーまたはセグメンテーションエラーがあります。 メモリスペースの再割り当てでエラーが発生することがあります。 基本的には、ユーザーから動的に文字配列を格納したい、つまり、ユーザーが任意の文字配列のサイズに直接入れることができる入力の容量を言わずに。動的サイズの文字配列でのランタイムエラー

答えて

2

ここで論理は間違っている:あなたは、実際にバッファのサイズを大きくしていない、とあなたもreallocの結果を破棄している

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

試してみてください。

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; 
    } 


また 、あなたは常にすべての文字にreallocを呼び出してしようとしているので、(ちなみに、非常に非効率的ですが、それは動作します)、この行:

input = (char *) malloc(sizeof(char)); 
input = NULL; 
(これはC言語ではないので、キャストを持たないでください)


そして最後に1つのバグ:

char c; 

は次のようになります。

int c; 

EOFのみ適切にintとして表すことができるので、そうでない場合は、あなたのwhileループは、終了しないことがあります。


だから、最終的に固定プログラムは、次のようなものになります。素晴らしい先生です

#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

を。しかし、私はまだTLEを取得しています。 _while(c = getchar())!= '\ n'){_ _realloc(input、(sizeof(char))); _ _ input [i ++] = c; _ _} _ あなたと一緒に! –

+0

上記の3つのバグ修正をすべて適用しましたか? –

+0

いいえ、基本的に私はwhileループで1つだけを適用しました。 私はそれらのすべてを適用する必要がありますか? –

関連する問題