【问题标题】:Program pauses at loop程序在循环处暂停
【发布时间】:2013-03-08 16:16:13
【问题描述】:

我有一个简单的 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;
   }

谁能帮帮我?

【问题讨论】:

  • scanf 很难用于未格式化的输入(来自用户的输入)。它用于格式化输入,因此其名称中包含 f。我建议您使用fgets 阅读用户输入并在之后对其进行解析。

标签: c while-loop scanf


【解决方案1】:

您在第二个scanf 调用中似乎打错了字,您使用%s 而不是%c 来读取op

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

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

char line[256];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d%c%d", &num1, &op, &num2);

【讨论】:

  • 有道理,但我试过了,回退到Unknown op: ,没有给出操作。
  • @user2129150 使用带有 %d 而不是 %c 的 scanf
  • 那是因为scanf 在输入流上留下了一个换行符。我会更新我的答案。
  • 我尝试了fgets 语法,但这一次它甚至不等待输入;相反,它会退回到Unknown op: ¿
  • 您是否将每个scanf 调用都替换为fgets/sscanf 对?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2017-03-12
    • 2014-06-09
    相关资源
    最近更新 更多