扫描程序等待另一个类似的程序

scanf - program waits for another like?

本文关键字:程序 另一个 等待 扫描      更新时间:2023-10-16

在下面的程序中,我希望在输入一个单词并按回车键后,我应该立即看到消息printf显示出来。然而,它不会发生,直到我输入一些其他随机单词。为什么呢?

#include <cstdio>
#include <cstdlib>
using namespace std;
char tictac[17];
int main() 
{
    scanf("%sn", tictac);

    printf("%sn", tictac);
    return 0;
}

tl;dr:使用scanf("%sn", 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("%sn", tictac);

%s告诉scanf读取,直到找到blank character (space, tab or new line),然后这里是catch忽略所有空格,直到遇到非空格字符。因此您的scanf将忽略您在输入字符串时按下的Enter和它后面的任何空白字符 (尝试在第二行输入空格并按enter。)

这意味着这将工作得很好(不像char版本)

scanf("%s", tictac);
scanf("%s", tictac2);

实际上在Windows上

因为"%s"导致库读取输入字符串,直到它找到一些空白,等效的格式说明符为"%[^x20tn]",指示库读取字符串直到它遇到一个空格字符(x20)、一个制表符字符(t)或一个换行符(n).

然而,由于您明确要求scanf匹配n

scanf("%sn", tictac);
         ^^

它将等待直到获得另一个n(在非空白字符之后),因为第一个字符被%s使用。

scanf调用中删除n

这里对scanf有很好的解释。在您的示例中,应该从scanf函数中删除n。