scanf - 程序等待另一个吗?

时间:2013-04-13 23:16:28

标签: 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;
}

3 个答案:

答案 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 characterspace, 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。