2017-03-15 13 views
-2

scanf()関数を使用して非常に多くの問題を抱えた後、文字列全体を読むための代替手段を探すことにしました。 \ nが見つかるまで)。私はここでstackoverflowのコードの興味深いビットにつまずいた。 このコードをより動的に変更したので、キーボードからのchar入力の後にmemmoryを割り当てたいと思っていました。私はそれが働くようになったが、引数としてはchar **aしかありません。main()では、これをread(&w);と呼びます。私の考えは、変数を宣言することなく使用できるように、引数のない関数を作成することです。char *w私が文字列を読む必要があるたびに。事前scanf()の代替方法を作成するには

char *read2() { 
int i = 0; 
char **a = NULL; 

while (1) { 

    *a = (char *)realloc(*a, (i + 1) * sizeof(char)) // Error here 
     scanf("%c", &(*(*a + i))); 
     if (*(*a + i) == '\n') { break; } 
     else { i++; } 
} 
    *(*a + i) = '\0'; 
return *a;} 

ありがとう:アクセス違反エラーを読む/

char *read(char **a) { 
int i = 0; 

while (1) { 
    *a = (char *)realloc(*a, (i + 1) * sizeof(char)); 
    scanf("%c", &(*(*a + i))); 

    if (*(*a+i) == '\n') 
     break; 
    else 
     i++; 
} 
*(*a+i) = '\0'; 
return *a;} 

は、今私は、引数を取りませんし、この機能を変更しようとしているが、私は、書き込みを取得しています:ここで私が得たコードです

+0

正確には、あなたの質問は何ですか? –

+0

POSIXには、あなたが望むことをする 'getline()'関数があります。それを使用できますか? – Barmar

+0

'fgets'や' getline'の1000thバージョンを再発明しようとしていますか? 'read'という名前は非常に悪い考えです。なぜなら、これはあなたのプラットフォームのシステムライブラリによって既に定義されているからです。 – Olaf

答えて

1

関数の問題は、あまりにも多くの間接レベルを宣言したことです。あなたは宣言します

char **a = NULL; 

*aに割り当てます。しかし、a == NULL以来、これはnullポインタを介して間接的に行われます。これは未定義の動作です。

ローカル変数に余分なレベルのインダイレクションを必要としません。これはパラメータにのみ必要なので、呼び出し元の変数を更新できます。

また、読んだときにEOFを確認する必要があります。 scanf()の代わりにgetc()を使用してください。

char *read2() { 
    int i = 0; 
    char *a = NULL; 

    while (1) { 
     a = (char *)realloc(a, (i + 1) * sizeof(char)); 
     int c = getc(stdin); 
     if (c == '\n' || c == EOF) { 
      break; 
     } else { 
      a[i] = c; 
      i++; 
     } 
    } 
    a[i] = '\0'; 
    return a; 
} 
+0

間接的なレベルの間接的で、これを知らないと、Cの初心者のように感じることができますが、感謝します。@ Barmarは素晴らしく働いていました。皆さん、ありがとうございました – Ferro

0

自分でロールする必要はありません。fgets()を使用してください。

また、getline()の機能をロールバックする必要がある場合は、fgetc()としてください。

+0

'fgets()'は、行全体に十分な長さがない場合、配列を再割り当てしません。 – Barmar

+0

はい、私は 'getline()'を提案しています。 –

-1

char ** - これは単なる文字ポインタなので、char *を使用してください。その後、すべての*を取り除くことができます。

+0

これは 'realloc'で配列を拡張することはできません。 – Barmar

+0

なぜですか?ポインタを渡すと、ポインタが再割り当てされます。 – bace1000

+0

'char **'は "文字ポインタ"ではありません。そして、Cは値渡しです。それが意味することを考えてみてください。 – Olaf

関連する問題