在以下程序中,我希望在输入单词并按下回车键后,我应立即看到消息printf
。但是,直到我输入其他随机单词才会发生。那是为什么?
#include <cstdio>
#include <cstdlib>
using namespace std;
char tictac[17];
int main()
{
scanf("%s\n", tictac);
printf("%s\n", tictac);
return 0;
}
答案 0 :(得分:4)
tl; dr :使用scanf("%s\n", tictac);
,您要求读取字符串,忽略后面的所有空白字符,然后读取新行。问题是,由于第一个空格被忽略,第一个 Enter 和第二个 Enter 之间应该至少有一个非空白字符(因此需要一些空白字符)在接受第二个 Enter 之前,垃圾非空白输入。)。
以下是使用scanf的\ n的示例用法。
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 。 跟随它的任何空白字符(尝试在第二行输入空格并按Enter键。)
这意味着它可以正常工作(与char版本不同)
scanf("%s", tictac);
scanf("%s", tictac2);
实际上是Windows
因为“%s”导致库读取输入字符串直到它 找到一些空格,等效的格式说明符是 “%[^ \ 0x20 \ t \ n]”,指示库读取字符串直到 遇到空格字符(\ 0x20),制表符(\ t)或a 换行符(\ n)。
但是,因为您明确要求scanf
匹配\n
scanf("%s\n", tictac);
^^
它会等到另一个\n
(在非空白字符之后),因为%s
使用了第一个{<1>}。
答案 1 :(得分:3)
从scanf来电中删除\n
。
答案 2 :(得分:1)
scanf here有一个很好的解释。在您的情况下,您应该从您的scanf函数中删除\ n。