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 character
space, tab or new line
scanf
Enter
つまり、これは問題なく動作します (char バージョンとは異なります)。
scanf("%s", tictac);
scanf("%s", tictac2);
実はWindowsで
"%s" により、ライブラリは空白が見つかるまで入力文字列を読み取るため、同等の書式指定子は "%[^\0x20\t\n]" です。スペース文字 (\0x20)、タブ文字 (\t)、または改行文字 (\n)。
ただし、明示的scanf
に一致するように要求しているため、\n
scanf("%s\n", tictac);
^^
\n
最初の 1 つが によって使用されたため、(空白以外の文字の後に)別の文字を取得するまで待機し%s
ます。