scanf - 程序等待另一个吗?

Nov*_*tor 5 c++ printf scanf

在下面的程序中,我希望在输入一个单词并按下回车键之后,我应该立即看到该消息printf.但是,直到我输入其他随机单词才会发生.这是为什么?

#include <cstdio>
#include <cstdlib>

using namespace std;

char tictac[17];

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


    printf("%s\n", tictac);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 4

tl;dr:当scanf("%s\n", tictac);您要求读取一个字符串时,忽略它后面的所有空白字符,然后读取一个新行。Enter问题是,由于第一个字符忽略所有空格,因此第一个字符和第二个字符之间应该至少有一个非空白字符(因此在接受第二个字符之前Enter需要一些垃圾非空白输入。)。Enter


下面是 \n 与 scanf 的用法示例。

char x, y;
scanf("%c", &x); 
scanf("%c", &y);
printf("%c %c", x,y); 
Run Code Online (Sandbox Code Playgroud)

使用此代码,您将看到输入一个字符并按Enter将直接转到该printf语句。这是因为第二个 scanf 将回车符(本身就是一个字符)读入 y 中。

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

对于这一点,杂散回车符将被忽略(或匹配)\n。并且正确的字符将被读给 y。


现在当我们看到你的代码时

scanf("%s\n", tictac);
Run Code Online (Sandbox Code Playgroud)

%s告诉scanf读取直到找到blank character( space, tab or new line) 然后这里是忽略所有空格直到遇到非空格字符。所以你scanf会忽略Enter你输入字符串时按下的键。以及其后的任何空白字符尝试在第二行输入空格并按 Enter 键。

这意味着这可以正常工作(与 char 版本不同)

scanf("%s", tictac);
scanf("%s", tictac2);
Run Code Online (Sandbox Code Playgroud)

实际上在Windows上

因为“%s”导致库读取输入字符串直到找到一些空格,所以等效的格式说明符是“%[^\0x20\t\n]”,它指示库读取字符串直到遇到空格空格字符 (\0x20)、制表符 (\t) 或换行符 (\n)。

但是,由于您已明确要求scanf匹配\n

scanf("%s\n", tictac);
         ^^
Run Code Online (Sandbox Code Playgroud)

它将等到它获得另一个\n(在非空白字符之后),因为第一个已被%s.