5

次のプログラムでは、単語を入力して Enter キーを押すと、すぐにメッセージが表示printfされるはずです。ただし、他のランダムな単語を入力するまでは起こりません。何故ですか?

#include <cstdio>
#include <cstdlib>

using namespace std;

char tictac[17];

int main() 
{
    scanf("%s\n", tictac);


    printf("%s\n", tictac);
    return 0;
}
4

3 に答える 3

4

tl;dr :scanf("%s\n", tictac);文字列の読み取りを要求している場合、その後のすべての空白文字を無視してから、新しい行を読み取ります。Enter問題は、すべての空白が最初の空白によって無視されるため、最初の文字と 2 番目の空白文字の間に少なくとも 1 つの空白以外の文字が存在する必要があることです (したがって、2 番目の文字が受け入れられる前に空白以外のEnterガベージ入力が必要になります)。Enter


以下は、scanf での \n の使用例です。

char x, y;
scanf("%c", &x); 
scanf("%c", &y);
printf("%c %c", x,y); 

このコードを使用すると、1 文字を入力して を押すと、ステートメントEnterに直接移動することがわかります。printfこれは、2 番目の scanf がキャリッジ リターン (それ自体が文字) を y に読み込むためです。

scanf("\n%c", &y);  // This is recommended to do if you have a sequence of scanfs (but not on the first one).

これを使用すると、迷走改行は無視されます (または一致します) \n。そして、正しい文字が y に読み込まれます。


今、あなたのコードに来たら

scanf("%s\n", tictac);

%s( )scanfが見つかるまで読み取るように指示します。次に、空白以外の文字が検出されるまですべての空白を無視するキャッチを次に示します。したがって、文字列を入力したときに押したものは無視されます。それに続く任意の空白文字( 2 行目にスペースを入力して、Enter キーを押してください。 )blank characterspace, tab or new linescanfEnter

つまり、これは問題なく動作します (char バージョンとは異なります)。

scanf("%s", tictac);
scanf("%s", tictac2);

実はWindowsで

"%s" により、ライブラリは空白が見つかるまで入力文字列を読み取るため、同等の書式指定子は "%[^\0x20\t\n]" です。スペース文字 (\0x20)、タブ文字 (\t)、または改行文字 (\n)。

ただし、明示的scanfに一致するように要求しているため、\n

scanf("%s\n", tictac);
         ^^

\n最初の 1 つが によって使用されたため、(空白以外の文字の後に)別の文字を取得するまで待機し%sます。

于 2013-04-13T23:20:22.480 に答える
3

scanf呼び出しからドロップ\nします。

于 2013-04-13T23:18:20.713 に答える
1

scanf hereの良い説明があります。あなたの場合、 scanf 関数から \n を削除する必要があります。

于 2013-04-13T23:21:47.000 に答える