5

在下面的程序中,我希望在输入一个单词并按下回车键后,我应该会立即看到消息printf输出。但是,直到我输入其他一些随机单词才会发生。这是为什么?

#include <cstdio>
#include <cstdlib>

using namespace std;

char tictac[17];

int main() 
{
    scanf("%s\n", tictac);


    printf("%s\n", tictac);
    return 0;
}
4

3 回答 3

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); 

使用此代码,您将看到输入一个字符并按下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.

于 2013-04-13T23:20:22.480 回答
3

\n从您的scanf呼叫中删除。

于 2013-04-13T23:18:20.713 回答
1

这里对 scanf 有很好的解释。在您的情况下,您应该从 scanf 函数中删除 \n 。

于 2013-04-13T23:21:47.000 回答