-1

我有一个简单的 C 程序,它循环从用户那里获取无限数量的数字(它是一种 CAS)。我正在用多种语言编写程序,虽然 C++ 版本运行良好,但 C 版本在循环结束时停止,当程序要求另一个用户操作时,需要用户输入两次操作。以下是该程序的工作方式:

输入操作
4+2
6
6 +2 // 用户在上一个答案的基础上加 2
8 +x // 用户可以无限期地继续这样加

相反,会发生以下情况:

输入操作
4+2
6 +2
// 在用户再次输入“+2”之前什么都不会发生
+2
8 +x
+x
[sum of 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;
   }

谁能帮我吗?

4

2 回答 2

2

看起来您在第二次scanf通话中打错了,您使用%s而不是%c阅读op.

此外,在使用scanf读取输入时,您必须非常小心空格。尾随空格(包括换行符)留在输入流上,因此下次您从输入流中读取时,它会首先看到空格。

不是使用scanf,而是使用fgets一次将输入一行读入缓冲区,然后从该缓冲区中解析出您需要的内容。例如。:

char line[256];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d%c%d", &num1, &op, &num2);
于 2013-03-08T16:21:34.583 回答
0

它表现得非常好,当您不在第一次迭代中时,您正在寻找 a string,即使您通过更改%c程序来修复它也只需要一个字符和一个数字而不是一个number character number序列。

于 2013-03-08T16:24:52.087 回答