2017-01-16 8 views
1

私は入力中に入力文字列を動的に割り当てるために、ユーザーにいくつの文字が長いのかを尋ねることなく、次の関数を書いています。入力文字列の動的割り当て

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

char* dyninp (char str[], int *n) { 
    char ch; 
    int i = 0; 
    do { 
    ch = getchar(); 
    str = (char *) realloc(str, (i+1)*sizeof(char)); 
    str[i] = ch; 
    i++; 
    } while (ch != '\n'); 

    /*substitute '\n' with '\0'*/ 
    str[i-1] = '\0'; 

    if (n != NULL) { 
    /*i contains the total lenght, including '\0'*/ 
    *n = i-1; 
    } 

    /*because realloc changes array's address*/ 
    return str; 
} 

/*it is called in this way: 
char *a; 
int n; 
a = dyninp (a, &n); 
*/ 

このコードは動作しますが、私はそれについていくつかの質問があります。

  1. なぜそれが動作しませんの?
    なぜ私はそれを実行すると、私はまた、Enterキーを押す前に文字を削除することはできません。 getchar()関数は、各繰り返しで1文字だけを読み込み、配列に書き込まれるので、いくつかの文字を削除するにはどうすればよいですか?
    '\ 127'を受け取ったときにgetchar()が前の文字を削除した場合、ループは他の文字と同じように実行されます。しかし、これは起こりません。なぜなら、ループが終了すると、「i」は常に要素の正確な数を含んでいるからです。

  2. 私のコードは効率的ですか?そうでない場合は、どうすればよいでしょうか(組み込み関数を使用していても)?最初の質問のための

答えて

1
  1. あなたは「生」モードでターミナルを入れない限り、あなたがリターンを押すまで、オペレーティングシステムは、アプリケーションへの入力が利用できるようにしていません。入力編集は、オペレーティングシステムによって処理されます。 getchar()を呼び出すと、ターミナルから直接ではなく、この入力バッファから文字が読み込まれます。

  2. 同じことをするPOSIX関数getline()があります。

1

回答:

この理由は、おそらく、端末ドライバでバッファリングしています。ノートセクションの短い説明はhereです。 getchar()関数は、文字列全体を受け取ったときに端末がユーザによってコミットされ、文字単位で返されるまで、入力を受け付けません。したがって、削除はプログラムではなく、端末の機能です。

関連する問題