我的程序应该连续读取数字并在用户输入负数时打印最大的数字,但是无论输入什么数字,循环似乎只会运行一次。
#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;
}
答案 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