C While循环无法正常运行

时间:2019-03-18 05:56:12

标签: c

我的程序应该连续读取数字并在用户输入负数时打印最大的数字,但是无论输入什么数字,循环似乎只会运行一次。

#include<stdio.h>

int main() {
    int largest;
    int num;

    while (num >= 0) {
        printf("Enter a number: ");
        scanf("%d%*c", num);
        if (num > largest) {
                num = largest;
        }
    }
    printf("%d is the largest.", &largest);

    return 0;
} 

1 个答案:

答案 0 :(得分:2)

您的代码存在几个严重问题。

首先,largest未初始化。它可能有任何价值。与num相同。

第二,对于scanf调用,应使用地址运算符,例如scanf("%d*c", &num)。如果您打开了编译器警告,则应该收到警告。

第三,您没有检查scanf的返回值。做这样的事情:

if(scanf("%d*c", &num) != 1) { /* Code to handle error */ }

第四,您不应在printf语句中使用地址运算符。同样,这是您应该收到的警告。

第五,num=largest应该是largest=num

始终至少使用gcc -Wall,但最好使用gcc -Wall -Wextra来编译代码。我使用gcc -Wall -Wextra -std=c11 -pedantic。然后看起来像这样:

$ gcc main.c -Wall
main.c: In function ‘main’:
main.c:9:17: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat=]
         scanf("%d%*c", num);
                ~^      ~~~
main.c:14:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("%d is the largest.", &largest);
             ~^                   ~~~~~~~~
             %ls

我还建议在做某事的同时进行更改。通常,当您至少要运行一次 循环时,这是最好的方法。它还消除了初始化num的需要。这是工作代码:

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

int main() {
    int largest = -1;
    int num;

    do {
        printf("Enter a number: ");

        if (scanf("%d%*c", &num) != 1) {
            fprintf(stderr, "Error reading number");
            exit(EXIT_FAILURE);
        }

        if (num > largest) {
                largest = num;
        }
    } while (num >= 0); 

    printf("%d is the largest.\n", largest);
} 

另外,值得一提的是,在此代码(以及您的原始代码)中,可能会发生以下情况:在scanf语句上按Enter键之前,“ Enter a number:”未打印出来;或者即使没有不太可能,但是可能会发生。一种避免这种情况的方法是这样做:

printf("Enter a number: ");
fflush(stdout); // Ensure that "Enter a number:" is printed before continuing

原因是stdout是缓冲流。您可以在此处阅读有关流缓冲的信息:https://eklitzke.org/stdout-buffering