【问题标题】:how can i break a loop by checking a condition如何通过检查条件来打破循环
【发布时间】:2021-06-05 08:47:30
【问题描述】:

我正在尝试对一些整数求和,当我按下“=”时,循环将终止并打印这些值的总和。我想在按相等之前给一个空间。

#include <stdio.h>

int main()
{
    int a, sum = 0;
    char b;

    while (1) {
        scanf("%d", &a);
        scanf(" %c", &b);

        sum += a;

        if(b == '=')
            break;
    }

    printf("sum = %d", sum);

    return 0;
}

【问题讨论】:

  • 您的问题是什么?按'='时它不会跳出循环吗?
  • 不,问题是如果我输入 1 2 3 4 它会给我 sum= 7
  • 您在循环中执行了两次 scanf,这就是原因。
  • 你需要学会调试你的代码。使用调试器单步执行,或在每次迭代中打印出变量。
  • 这真的与循环无关。

标签: c loops if-statement char


【解决方案1】:

两个scanf,即

    scanf("%d", &a);
    scanf(" %c", &b);

会这样工作:

输入:“1 2 3 4 =”

在第一个循环中,a 将变为 1,b 将变为 2。

在第二个循环中,a 将变为 3,b 将变为 4。

现在剩下的字符串是“=”

所以在第三个循环中没有整数要扫描,因此a 的值仍然为 3。b 将获得值= 并且循环终止。

所以sum 是 1 + 3 + 3,即 7

您可以使用简单的printf 语句检查:

    scanf("%d",&a);
    printf("a=%d\n",a);
    scanf(" %c",&b);
    printf("b=%c\n",b);

Input:
1 2 3 4 =

Output:
a=1
b=2
a=3
b=4
a=3
b==
sum= 7

记住:总是检查scanf返回的值——比如:

if (scanf("%d",&a) != 1)
{
    // Error - didn't scan an integer
    // add error handling
    ...
}

所以你可以这样做

while(1){
    if (scanf("%d",&a) != 1)
    {
        // No integer found
        
        // Add error handling...
        // For now - just stop the loop
        break;
    }
    sum+=a;
}

对于像“1 2 3 4 =”这样的输入,结果为 10。

但是,像“1 2 3 4 HelloWorld”这样的输入也会给出结果 10,即任何非整数输入都会简单地终止循环。如果您只想在输入为= 时终止循环,您可以扩展错误处理。

【讨论】:

  • 这是一个很好的答案,因为它不仅提出了一种简单、标准的修复方法,而且阐明了它为什么会这样。
【解决方案2】:

您的问题是因为您在循环中执行了两次 scanf。

改为这样做:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int sum=0;
    char a[10];
    while(1){
        scanf("%9s", a); // makes sure we won't have memory overflow 
        if(strcmp(a, "=") == 0)
            break;
        sum+=atoi(a);
    }
    printf("sum= %d",sum);

    return 0;
}

【讨论】:

  • 请注意,只有第 0 个索引会检查 = 输入。
  • 没错,我保持简单,因为我认为@IshanAhmed 只是在寻找能够正确汇总数字的东西。他可以对潜在的无效输入进行错误处理。
  • OP 想要:当我按下“=”时,循环将终止并打印总和
猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多