我希望每个用户输入的数组(标记)大小增加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++;
}
}
答案 0 :(得分:1)
我希望每个用户输入的数组(标记)大小增加1。
这不是数组在C语言中的工作方式。
要获得该功能,您必须使用malloc
和realloc
动态分配的内存。
此外,您的代码有逻辑缺陷。如果您查看控制循环的变量,您将:
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