当使用gcc编译到Linux时,每次用户输入任何答案时,程序在其他迭代中到达代码的相同部分但不等待用户的输入,而是向scanf函数提供换行符,使程序打印'我不明白!'每次......程序有效,但我仍然不希望它写出“我不明白!”,独立于用户的回答。 这是代码的特定部分。
do
{
printf("\n\nAnswer: (y/n) ");
scanf("%c", &ans);
//printf("\n->%c<-\n", ans); //just for debugging
if (ans == 'y')
{
age += v[0];
}
else if (ans != 'n')
{
printf("\nI don't get it!\n");
}
} while (ans != 'y' && ans != 'n');
这些是声明:
char v [64];
char ans;
(这个do..while循环在'for'里面) 令我感到震惊的是,程序编译和运行完全符合我在Windows上的预期......(使用MinGW) 我曾尝试在scanf之前和/或之后使用fflush(stdin),但它没有帮助。 一个重要的观察是,第一次达到这个问题时,它就像预期的那样。
(在用户回答之前)
答案:(y / n)
我不明白! //这是每次都写的,但是第一次答案:(y / n)n
你今年21岁!
如果用户写入无效输入:
答案:(y / n)w
我不明白!
答案:(y / n)//这条线和下一条线应该根本不打印 我不明白!
答案:(y / n)
//(现在它等待用户输入)
有什么想法吗?
修改
修正了它:
(我宣布了一个额外的char buf[50]
)
do
{
printf("\n\nAnswer: (y/n) ");
fgets(buf, 50, stdin);
sscanf(buf, " %c", &ans);
if (ans == 'y')
{
age += v[0];
}
else if (ans != 'n')
{
printf("\nI don't get it!\n");
}
} while (ans != 'y' && ans != 'n');
有人能告诉我scanf有什么问题吗?
答案 0 :(得分:1)
停止使用scanf
。现在
请改用fgets(buffer, BUFLEN, stdin)
。然后使用sscanf
来解析结果。它会更强大,它可以解决你的问题。
我听说它在格式说明符周围添加空格也有帮助,因为它摆脱了残留的“空白”。 scanf(" %c", &ans);
但我不喜欢它。
更新这里是一段代码,我认为这些代码就像你想要的那样(我用printf
语句替换了内部但是你明白了;我也替换了你的{{带有if
的1}} - 我认为它更干净了:
switch
答案 1 :(得分:0)
关注@Floris回答fgets()
。
如果必须使用scanf()
,请使用
scanf(" %c", &ans);
"%c"
之前的空格将消耗任何和所有前导空格,包括前一行的 Enter 或'\n'
。
当然,您不希望添加以下空格,因为这会导致scanf()
占用所有空白区域,直到输入另一个非空白区域为止。由于stdin
通常是缓冲的,因此在将行提供给'\n'
后需要非空白空格后,它们意味着额外的scanf()
。