可能重复:
程序不等待用户输入scanf("%c",&yn(;
我刚开始用C语言编程,突然出现了一些奇怪的东西(我在C++中没有遇到(。
在头文件中,我声明了一个变量(请参阅.h
文件代码中的onemoretime
(,其值稍后将通过scanf()
使用用户输入进行设置。出于某种原因,使用变量的条件语句无法正常工作,要么返回无限重复的结果,要么就是什么都不做。我设置了一些断点,发现第一次在main()
函数中调用onemoretime
时,由于某种原因,onemoretime
的值被设置为n
。
这不是scanf()
应该识别的值,但输入被视为新行(显然(。当我输入y
时,它应该触发else if
条件并循环回main()
的开头,Xcode的调试器只简单地说,error: 'y' is not a valid command.
这是我的.h
文件:
#ifndef C1_Header_h
#define C1_Header_h
float num1, num2;
char op, onemoretime;
#endif
这是.c
文件中的相关代码:
#include <stdio.h>
#include <math.h>
#include "Header.h"
int main(int argc, const char * argv[])
{
printf("Enter a two-number calculation below:n");
while (1)
{
scanf("%f%c%f", &num1, &op, &num2);
// addition
if (op == '+')
{
printf("%fn", num1+num2);
printf("nDone. Would you like to solve another math problem (y/n)?n");
scanf("%c", &onemoretime);
while (1)
{
if (onemoretime == 'n')
{
printf("Ok. Terminating program.");
return 0;
}
else if (onemoretime == 'y')
{
// loop back to start main function
}
}
}
}
// rest of code, irrelevant here
}
如果它是一个因素,将鼠标悬停在Xcode中的onemoretime
变量上(显示其基本属性(,则头文件中初始声明之后的每个变量实例都会显示值为n
。
我做错了什么?onemoretime
的值如何由用户设置,而不是在用户到达之前由程序设置?
[
n
]不是scanf()
应该识别的值,[…]
通常情况下是这样,但"在[%c
]的情况下]会抑制对空白字符的正常跳过"[link]。
要获得op
和onemoretime
,我建议使用fgetc
(链接(而不是scanf
,并自行处理跳过的空白。
每当您想用scanf()
获得一个单独的字符时,您必须始终使用一些东西来吸收换行符。您可以执行类似scanf("%cn",&onemoretime);
的操作