【问题标题】:Declaring Unknown Number of User Inputted Variables?声明未知数量的用户输入变量?
【发布时间】: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 &gt; ", Num);scanf("%lf %lf", &amp;a, &amp;b);...此外,您的循环永远不会结束,因为您不增加 i。此外,您应该 1. 检查 scanf() 的返回值和 2. 根本不使用 scanf() 并改用 fgets()
  • 啊,所以如果在命令行末尾包含变量,您不必包含另一个 printf() 行?非常感谢!
  • 这就是格式字符串的目的... >.
  • 另外,最好将数字的个数输入为整数,而不是浮点值;在获得 EOF 或转换失败之前,只读取数字可能会更好。您应该检查来自scanf() 的返回值,以便您知道它有效。您可以使用if (scanf("%lf %lf", &amp;a, &amp;b) != 2) { ...handle EOF or error... } 读取成对的数字。
  • 处理不定数量值的一种方法是将它们存储在数组中。如果可以使用 C99,则可以使用固定大小的数组或 VLA(可变长度数组),或动态分配的数组(使用 malloc()realloc())。在每种情况下,您都需要确保不要尝试存储超出数组容量的值,以免遇到“缓冲区溢出”。或者,您可以一遍又一遍地将值读入同一个变量,随时处理每个值(计算它,确定最小值或最大值,累积平均值或几何平均值等)。如果它是一个选项,这是最好的。

标签: c


【解决方案1】:

您真的需要同时在内存中使用所有变量吗?

例如,如果您计划计算未指定数量的用户输入数字的最大值,则只需要两个变量,而不是未指定数量的变量。

【讨论】:

  • 这可以说是评论,而不是答案。
  • 是的。我也在尝试计算几何平均值,尽管这实际上可以通过创建另一个变量并在循环继续时对其求和来计算。我想。
  • @JonathanLeffler 我也与自己争论是否将其作为评论,但我注意到他的程序中的maxmin 标识符,所以我认为这实际上是对他的问题的答案。
【解决方案2】:

您可能希望使用指向双精度数组的指针来保存您的数字并在运行时为其分配内存...

    #include <stdio.h>

    int main() 
    {
        double Num;
        double *a,*b,*c;
        double max,min;
        int i=0;

        printf("How many numbers? > ");
        scanf("%lf", &Num);

        a = malloc( sizeof( double ) * Num );
        b = malloc( sizeof( double ) * Num );
        c = malloc( sizeof( double ) * Num );

        if( !a || !b || !c )
        {
            printf( "Out of memory\n" );
            exit( -1 );
        }

        printf("OK, now please enter %lf floating point numbers > ", Num);

        while(i<=Num) 
        {
            scanf("%lf", &a[i]);
            scanf("%lf", &b[i]);
        }

        // do stuff with c

        free( a );
        free( b );
        free( c );

        exit( 0 );
    }

【讨论】:

    【解决方案3】:

    建议(改动很小):

       #include <stdio.h>
    
       int main() {
         int Num;
         double a,b,c;
         double max,min;
         int i=0;
    
         printf("How many numbers? > ");
         scanf("%d", &Num);
    
         printf("OK, now please enter %d floating point numbers >", Num);
         for (i=0; i < Num; i++) {
           scanf("%lf %lf %lf", &a, &b, &c);
           printf ("you entered: a=%lf, b=%lf, c=%lf\n", a, b, c);
    
         }
    
         return 0;
        }
    

    注意:此代码假定您只需要当前的 a、b 和 c(例如,将它们与当前的最小值和最大值进行比较)。如果您想保留所有您输入的 a、b 和 c 值 ...l,那么您需要将它们存储在数组或列表中。

    C++ 有一个定制的“vector”类。但是,如果您使用 C“数组”,则通常需要预先知道最大 #/elements,在分配数组之前。您可以通过使用“malloc()”在一定程度上缓解这种情况 - realloc() 允许您在运行时更改数组大小。

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多