【问题标题】:keeping a variable from inside a while loop?在while循环中保留一个变量?
【发布时间】:2015-01-05 23:12:20
【问题描述】:

我正在尝试创建一个程序,它将输入输入到一个数组中,然后在输入终止时将它们全部打印出来。我的理解是,当您在循环的 outside 声明一个变量时,它会保留这些值,但我无法解决这个问题。我知道有办法以某种方式做到这一点,但我正在画一个空白。

#include <stdio.h>
int main(){
    int i=0;
    int n=0;
    int size=0;
    int numbers[i];
    scanf("%d", &numbers[i]);
    while ((i = 1 && numbers[i-1] != 42)){
        scanf("%d", &numbers[i]);
        i++;
        size++;
        //printf("%d",numbers[i]);
    }
    printf ("%d", sizeof(numbers));
    while ((n = 0 && n < sizeof(numbers))){
        printf("%d", numbers[i]);
        printf("\n");
        ++i;
        ++n;
    }
}

【问题讨论】:

  • 这有意义吗:int i=0;, int numbers[i]; ???
  • while ((i = 1 &amp;&amp; numbers[i-1] != 42)){ 将在迭代之前将i 设置为 1。它不允许i 增加。使用for 循环。
  • 另外,当 i 为 0 时,int numbers[i] 是非法的(即始终在您的代码中)。

标签: c loops while-loop


【解决方案1】:

您的while 条件:

(i = 1 && numbers[i-1] != 42) 

有两个问题:

  • i = ... 实际上为i 赋值。如果出现意外循环,请始终检查条件中是否存在=而不是==

  • 由于operator precedence,您将1 &amp;&amp; 分配给i。只要您在循环中,这就是真实值(即 1),并且一旦 numbers[i-1] 为 42,i 变为 0(因为 numbers[i-1]!=42 为 false 而 1 &amp;&amp; false 为 false 即 0 )。这给你的印象是它没有保持价值。

编辑:当然,第二个循环中 n 的原理是一样的 ;-)

【讨论】:

  • 谢谢!这是有道理的。
【解决方案2】:

您的代码中有 3 件事:

  • int 数字[i];正在尝试声明一个零元素数组,这会导致未定义的行为。(尽管 C 中没有边界/范围检查)
  • scanf("%d", &numbers[i]), when i>=1 为这个分配的存储空间在哪里?大多数情况下最终会出现在未定义的区域/覆盖现有值。

更多信息请参考以下链接:

Declaring an array with 0 number of elements can still store values

Why does C not define minimum size for an array?

这表示您可以声明一个固定大小的数组,也可以使用 malloc 动态声明大小,然后循环遍历元素,分配并打印它们。

-while循环:运算符的评估和优先级: 您可以将程序重写为:

#include <stdio.h>
int main(){
    int i=0;
    int n=0;
    int size=0;
    int numbers[42];

    scanf("%d", &numbers[i++]);
    while (((numbers[i-1] != 42)))
        scanf("%d", &numbers[i++]);

    size=sizeof(numbers)/sizeof(int); /* Not necessary as array size pre-defined*/
    printf("\nsize:%d\n",size);

    while(n < size)
        printf("%d\n", numbers[n++]);
    printf("\n");
}

注意:你可以改变数组的大小,请记住它是一个自动变量,那些没有被显式初始化的数组元素将被垃圾值填充。

【讨论】:

    【解决方案3】:

    你的代码有很多错误,如下-

    1.int i=0; 整数[i];这没有任何意义。因为您正在创建一个大小为 0 的数组

    1. while ((i = 1 && numbers[i-1] != 42)) 每次 while 循环迭代时,它都会将 i 的值设置为 1 并比较 numbers[0]!=42 这也没有意义。

    2. while ((n = 0 && n

    虽然您没有正确指定问题,但我假设您要扫描数字直到得到 42。然后您还想打印数组的大小和数字。 这是您的工作代码。

        #include <stdio.h>
        int main(){
        int i=0;
        int n=0;
        int size=1;
        int numbers[10000];//I am assuming maximum input to be 10000
        scanf("%d", &numbers[0]);
        i=1;
        while (( numbers[i-1] != 42)){
            scanf("%d", &numbers[i]);
            i++;
            size++;
            //printf("%d",numbers[i]);
        }
        printf ("size=%d\n", size);
        while ( n < size){
            printf("%d", numbers[n]);
            printf("\n");
            //++i;
            ++n;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 2022-01-24
      • 2014-06-11
      • 2021-05-31
      • 2013-11-15
      相关资源
      最近更新 更多