2017-03-26 35 views
5

以下のコードのループで、scanf("%[^\n]s",array)が機能しません。それは入力を待つことなくスキップされます。しかし、%の前のスペースで問題が解決されます。どうして?ここでscanfの[^ n]が入力を待たずにスキップされる

は間違っプログラムです。ここで

#include <string.h> 
#include <stdio.h> 

int main()  
{  
    int t; 
    scanf("%d",&t); 
    while(t--){ 
     char arr[199]; 
     scanf("%[^\n]s",arr); 
     printf("%s",arr); 
    } 
    return 0; 
} 

は、右のコードです:それが動作するために期待されるよう

#include <string.h> 
#include <stdio.h> 

int main() 
{  
    int t; 
    scanf("%d",&t); 
    while(t--){ 
     char arr[199]; 
     scanf(" %[^\n]s",arr); 
     printf("%s",arr); 
    } 
    return 0; 
} 

は、なぜそれが%の前にスペースが必要ですか?

+0

これはスキップする必要がある改行があるためです。最初のscanfは数字を読み込んだだけで、まだ入力に改行が残っています。ループ内のscanfsは、改行で改行を読み取ることができず、残った改行を吸収するスペースもありません。実際には、ループ内でscanf( "%s"、arr)を使用することができます。 – Shiping

+0

これを確認してください。https://stackoverflow.com/questions/45038176/not-able-to-input-a-string-with-spaces-in-a-loop-in-c/45038767?noredirect= 1#comment77052162_45038767私は最近、答えました –

答えて

1

の場合、改行を読み込んだ後でscanf()が停止します。したがって、最初の入力の後に、消費されない改行が残っています。 したがって、後続のscanf()呼び出しでは、入力がまったく読み取られません。

スペースが%[^\n]の場合、scanf()は任意の数の空白文字を無視します。したがって、scanf()は残りの改行を無視します。 scanfから:

空白文字の列(スペース、タブ、改行など; isspace(3)を参照)。このディレクティブは、の空白を入力に含めます。

ところで、フォーマット文字列の末尾に余分な文字を入力する必要はありません。s

scanf()fgets()は、スペースがあれば改行文字をバッファに読み込みます)よりも優れています。fgets()を使用してください。また、Why does everyone say not to use scanf? What should I use instead?を参照してください。

+0

Thnxxxすべて私は今理解しています...本当にありがとう – ammasum

2

まず、末尾s%[フォーマット指定のない一部であるので、それを削除し、約%[^\n]話をすることができます。

さて、何%[^\n]行うにscanfに指示することはarr、この場合には、その対応する引数にいずれか早い方の改行文字('\n')またはEOF、まですべてのもの、および格納をスキャンしています。

キャッチ:%[^\n]は、最初に読み取られる文字が\nの場合に失敗します。

'待機'と言います。 '私は一人で入力しませんでした。だから、なぜ失敗したのだろう? '。真実。あなたはしませんでした。しかし、を覚えておいてください前の行に押したを入力してください。外に出て、scanfへの前の呼び出しは、\n\nを残すまでとなるまですべてをつかんで返します。ループの次の繰り返しで、scanfscanfの前回の呼び出しによって残されたこの\n文字を見て、失敗し、スペースについては0

を返すので、それは空白文字です。scanfの空白文字は、空白文字以外の最初の文字まですべての空白文字をスキャンして破棄するように指示します。したがって、それは\n(空白文字なので)を削除し、さらに入力を待つのはscanfです。

関連する問題