在某些情况下为假时如何中断while循环

时间:2020-01-07 06:47:27

标签: c while-loop integer

我试图制作一个程序,如果我输入整数,程序将找出较大的数字,然后减去较小的数字。这部分,我明白了。

问题是无限循环部分。

我试图让type in two integers继续在while循环中打印,而在break键入至少一个字符时继续打印。

例如,如果我输入2 @,它将损坏。

但是我找不到在代码内获取break;的写位置,因此,每当我输入一个字符时,它都会继续创建无限循环。

是否可以在此代码中创建中断?我谦虚地寻求建议...

以下是我无法放入break的代码 (顺便说一句,我之所以在sizeof(i)==4 || sizeof(j)==4之内做该条件是为了使它只能输入一个整数,因为整数的大小为4)

int main()
{   
    int i, j;
    int result;

    while (sizeof(i)==4 || sizeof(j)==4){
        printf("type in two integers : ");
        scanf("%d %d", &i, &j);
        if (i < j) {
            result = j - i;
        }
        else if (j < i){
            result = i - j;
        }

        printf("%d\n", result);
    }

    return 0;
}

最下面的代码是我试图放入break但失败的代码(它不断创建无限循环)...

int main()
{   
    int i, j;
    int result;

    while (sizeof(i)==4 || sizeof(j)==4){
        if (sizeof(i) == 4 || sizeof(j) == 4) {
            printf("type in two integers : ");
            scanf("%d %d", &i, &j);
            if (i < j) {
                result = j - i;
            }
            else if (j < i) {
                result = i - j;
            }

            printf("%d\n", result);
        }
        else
            break;
    }

    return 0;
}

这是我摆脱sizeof并使用while(1)的代码,尽管break不起作用的事实并没有太大变化。

int main()
{   
    int i, j;
    int result;

    while (1){
            printf("type in two integers : ");
            scanf("%d %d", &i, &j);
            if (i < j) {
                result = j - i;
            }
            else if (j < i) {
                result = i - j;
            }

            printf("%d\n", result);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

您不能使用sizeof(i)进行运行时检查!这是一个 编译时间 常量,在您的情况下(32位整数)将始终求值为 4 >。

为了检查是否已给出两个有效的整数,您可以检查scanf函数的返回值(它成功地给出了字段数 扫描):

#include <stdio.h>

int main()
{
    int i, j;
    int result;

    while (1) {
        printf("type in two integers : ");
        if (scanf("%d %d", &i, &j) != 2) break; // Break here if we didn't get two integers
        if (i < j) {
            result = j - i;
        }
        else if (j < i) {
            result = i - j;
        }

        printf("%d\n", result);
    }

    return 0;
}

请随时提出进一步的澄清和/或解释。

答案 1 :(得分:3)

丢弃if内包含break的无限循环的整个概念。
根据{{​​1}}的返回值(实际上就是它的设计目标)为循环创建条件。

scanf()

我可能实际上会使用#include <stdio.h> int main() { /* always init everything */ int i=0, j=0; int result=0; printf("type in two integers : "); while (2==scanf("%d %d", &i, &j)) { if (i < j) { result = j - i; } else /* removed second if, to have a meaningful result for i==j */ { result = i - j; } printf("%d\n", result); printf("type in two integers : "); } return 0; } 和一个变量,该变量存储要在循环条件中使用的返回值do {...} while (...)。我认为不必复制打印件会更优雅,但我将其与您的代码结构保持更近的距离。

有关您的代码的更多注释:

    如评论中所述,
  • scanf()的工作方式与您似乎想的不同;它是静态的,在运行时不会更改,因此不能在循环条件下使用
  • 对于sizeof(),永远不可能达到b,因为while (sizeof(i)==4 || sizeof(j)==4){if (sizeof(i) == 4 || sizeof(j) == 4){/* a */} else {/* b */}while的条件相同
  • 检查循环中if条件的可能结果,即使if处于未定义状态并返回未初始化的值
  • 始终将所有变量初始化为习惯
  • 要获得良好的MRE,请包含包含行

根据您的要求,这是“做一会儿”替代方案的建议:

i==j