在下面的程序中,我希望在输入一个单词并按下回车键之后,我应该立即看到该消息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.