为什么for循环仅运行4次后终止?

时间:2018-08-09 16:52:33

标签: c for-loop

我希望每个用户输入的数组(标记)大小增加1:

#include <stdio.h>
main() {
    int size=1;
    int marks[size];
    int i;
    printf("Enter marks\n");
    for(i=0;i<size;i++) {
        scanf("%d",&marks[i]);
        size++;
    }
}

5 个答案:

答案 0 :(得分:1)

  

我希望每个用户输入的数组(标记)大小增加1。

这不是数组在C语言中的工作方式。

要获得该功能,您必须使用mallocrealloc动态分配的内存。

此外,您的代码有逻辑缺陷。如果您查看控制循环的变量,您将:

int size=1;
int i;
for(i=0;i<size;i++) { // i will never catch up to size before size overflows
    size++;
}

根据需要,您可以使用可变长度数组(VLA)或仅使用malloc

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

int main()
{
   int size;
   int i;

   printf("Enter size\n");
   if ( scanf("%d", &size) != 1 )
   {
      // Problem. Deal with error.
   }

   // Use a VLA
   int marks[size];

   // or
   // Allocate memory.
   // int* marks = malloc(sizeof(*marks)*size);


   printf("Enter marks\n");
   for ( i = 0; i < size; i++)
   {
      if ( scanf("%d", &marks[i]) != 1)
      {
         // Problem. Deal with error.
      }
   }

   // Deallocate the memory. Needed when using malloc
   // free(marks);
}

答案 1 :(得分:1)

因为您已经静态声明了标记数组为size 1,因为您在循环中递增size会导致未定义的行为。更好的方法是动态分配标记。 请考虑以下示例以供参考。

#include <stdio.h> 
#include<stdlib.h>
void main() {
 int size=0; 
 int *marks = NULL;
 int i; 

printf("Enter number of marks\n");
scanf ("%d",&size);
marks = (int *) malloc(size*sizeof(int));

printf("Enter marks\n");
 for(i=0;i<size;i++)
 { 
     scanf("%d",&marks[i]); 
 } 
}

答案 2 :(得分:1)

您不能动态增加数组的大小。但是,如果您知道将输入多少个分数,则可以将大小设置为该值,然后接受值直到达到该大小。

#include <stdio.h>
int main()
{
  int size = 10;
  int marks[size];
  int i;
  printf("Enter marks\n");
  for(i = 0; i < size; i++)
  {
    scanf("%d",&marks[i]);
  }
}

动态调整大小会显着增加程序的复杂性,但是,如果这正是您要执行的操作,请在此处查看R Sahu的答案或以下答案:https://developers.google.com/analytics/devguides/collection/gtagjs/cookies-user-id

答案 3 :(得分:1)

您的代码假定size的增加将增加本机数组的大小。这不是数组在C中的工作方式。

C中的本机数组在定义后为固定长度。如果要动态扩展事物序列,则需要管理动态序列,并在收到有效数据时进行内循环处理。

代码

以下命令以(显然是缺少)您的代码的方式提示用户。但是,添加了一个循环终止条件(标记项-1将终止循环,任何无效的不可转换输入也将终止)。

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

int main()
{
    int *marks = NULL, mark = 0;
    int size = 0;

    printf("Enter marks\n");

    while (scanf("%d", &mark) == 1 && mark != -1)
    {
        // expand marks
        void *tmp = realloc(marks, (size+1) * sizeof *marks);
        if (tmp == NULL)
        {
            perror("Failed to expand marks array");
            exit(EXIT_FAILURE);
        }

        marks = tmp;
        marks[size++] = mark;
    }

    // TODO: use marks[0] through marks[size-1] here
    for (int i=0; i<size; ++i)
        printf("%d ", marks[i]);
    fputc('\n', stdout);


    // then free marks
    free(marks);

    return EXIT_SUCCESS;
}

样本输入

1 2 3 4 
5 6 
7 8 9
10 -1

输出

1 2 3 4 5 6 7 8 9 10

注意:有更有效的几何增长算法,可以大大减少realloc调用的次数,例如,将每个realloc的先前序列大小加倍,并跟踪大小和容量< / em>会将您的分配数量从n减少到log(n)。但是,为了对内联序列增长有基本的了解,此示例就足够了。

答案 4 :(得分:-1)

tbl_Area