【发布时间】:2013-04-24 06:48:36
【问题描述】:
我是一名新程序员,希望了解循环并与用户交互。
我正在尝试用 C 语言编写一些程序,其中涉及用户输入一系列数字,然后扫描这些变量并用它们做一些事情。但是,我知道您应该在程序开始时声明变量。问题是,如果没有明确声明可能包含的最大变量数,我不知道如何在程序开始时声明未知数量的变量。有人对如何为未知数量的变量循环 scanf() 有任何建议吗?
以下是有限版本的代码,所以每个人都知道我在做什么。
#include <stdio.h>
int main() {
double Num;
double a,b,c;
double max,min;
int i=0;
printf("How many numbers? > ");
scanf("%lf", &Num);
printf("OK, now please enter ");
printf("%lf", Num);
printf(" floating point numbers > ");
while(i<=Num) {
scanf("%lf", &a);
scanf("%lf", &b);
}
【问题讨论】:
-
旁注:您确实意识到格式字符串很棒,因为您可以,呃...将它们用作格式字符串?
printf("OK, now please enter %lf floating point numbers > ", Num);和scanf("%lf %lf", &a, &b);...此外,您的循环永远不会结束,因为您不增加i。此外,您应该 1. 检查scanf()的返回值和 2. 根本不使用scanf()并改用fgets()。 -
啊,所以如果在命令行末尾包含变量,您不必包含另一个 printf() 行?非常感谢!
-
这就是格式字符串的目的... >.
-
另外,最好将数字的个数输入为整数,而不是浮点值;在获得 EOF 或转换失败之前,只读取数字可能会更好。您应该检查来自
scanf()的返回值,以便您知道它有效。您可以使用if (scanf("%lf %lf", &a, &b) != 2) { ...handle EOF or error... }读取成对的数字。 -
处理不定数量值的一种方法是将它们存储在数组中。如果可以使用 C99,则可以使用固定大小的数组或 VLA(可变长度数组),或动态分配的数组(使用
malloc()和realloc())。在每种情况下,您都需要确保不要尝试存储超出数组容量的值,以免遇到“缓冲区溢出”。或者,您可以一遍又一遍地将值读入同一个变量,随时处理每个值(计算它,确定最小值或最大值,累积平均值或几何平均值等)。如果它是一个选项,这是最好的。
标签: c