在下面的程序中,我希望在输入一个单词并按下回车键后,我应该会立即看到消息printf
输出。但是,直到我输入其他一些随机单词才会发生。这是为什么?
#include <cstdio>
#include <cstdlib>
using namespace std;
char tictac[17];
int main()
{
scanf("%s\n", tictac);
printf("%s\n", tictac);
return 0;
}
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);
使用此代码,您将看到输入一个字符并按下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).
有了这个,杂散的回车将被忽略(或匹配)\n
。并且正确的字符将被读到 y。
现在,当我们来到您的代码时
scanf("%s\n", tictac);
%s
告诉scanf
阅读直到找到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
(在非空白字符之后),因为第一个被%s
.
\n
从您的scanf呼叫中删除。
这里对 scanf 有很好的解释。在您的情况下,您应该从 scanf 函数中删除 \n 。