我有一个简单的C程序,它循环从用户那里获得无限数量的数字(它是各种CAS)。我正在使用多种语言编写程序,并且在C ++版本完美运行时,C版本在循环结束时停止,当程序要求另一个用户操作时,要求用户输入两次操作。以下是该计划的运作方式:
输入操作
4 + 2
的 6
6 +2 //用户将2添加到上一个答案
8 + x //用户可以继续无限期地添加
相反,这里发生了什么:
输入操作
4 + 2
的 6 2
//在用户输入" + 2"之前没有任何反应再次
+2
的 8 + X
+ X
[总和8 + x]
等等。
我最初认为这个暂停是由于程序要求用户输入两次,一次是在循环开始时,然后是在循环之前结束。我在循环中放置了一个迭代计数器来确定程序应该获得什么样的输入(&num1,&op,&num2
或&op,&num2
)。出于某种原因,这并没有什么不同。这是代码的相关部分:
int opnubmer;
opnumber = 0;
printf("Enter an operation\n");
while(op != '=')
{
if (opnumber == 0)
{
scanf("%d%c%d",&num1,&op,&num2);
}
else if (opnumber != 0)
{
scanf("%s%d",&op,&num2);
}
switch(op)
{
case '+':
num2 += num1;
break;
case '-':
num2 -= num1;
break;
case '*':
num2 *= num1;
break;
case '/':
num2 /= num1;
break;
default:
printf("%s%c%s", "Unknown op: ", op, "\n");
exit(1);
}
printf("Solution: ");
printf("%d",num2);
opnumber++;
num1=num2;
}
任何人都可以帮助我吗?
答案 0 :(得分:2)
看起来您在第二次scanf
来电中输了一个拼写错误,您使用%s
代替%c
来阅读op
。
此外,当使用scanf
读取输入时,您必须非常小心使用空格。尾随空格(包括换行符)留在输入流上,因此下次从输入流中读取时,空格是它将首先看到的内容。
不使用scanf
,而是使用fgets
一次将输入的一行读入缓冲区,然后从该缓冲区中解析出您需要的内容。例如。 :
char line[256];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d%c%d", &num1, &op, &num2);
答案 1 :(得分:0)
它表现得非常好,当你不在第一次迭代时,你正在寻找一个string
,即使你修改了%c
你的程序只需要一个字符和一个字符数字不是number character number
序列。