我想为循环次数创建一个简单的变量,所以我尝试了代码
int size,counter,marks[size];
scanf("enter %d/n",&size);
for(counter=0;counter<size;counter++)
{
scanf("%d",&marks[counter]);
}
,并且在运行时没有错误,但仅显示"process returned -1073741571 <0*c00000FD>
。
所以我尝试了gets
函数,它显示了"too many arguments to function 'gets' "
。
int size;
int counter;
int marks[size];
scanf("enter %d/n",&size);
for(counter=0;counter<size;counter++)
{
gets("%d",&marks[counter]);
}
我正在使用code :: blocks 17.12和gnu编译器。
答案 0 :(得分:1)
size
必须具有定义的值,例如:
#include <stdio.h>
int main()
{
int size;
size = 5; // size must be constant
int counter, marks[size];
for (counter = 0; counter < size; counter++)
{
scanf("%d", &marks[counter]);
}
//Printing it returns correct values:
for (counter = 0; counter < size; counter++)
{
printf("%d\n", marks[counter]);
}
}
您可以根据需要从用户输入其值。
但是,如果由于某种原因在声明数组之后要定义size
,请使用指针:
#include <stdio.h>
#include "stdlib.h"
int main()
{
int size;
int counter, *marks;
size = 5; //declared after the array
marks = (int *)malloc(size * sizeof(int));
for (counter = 0; counter < size; counter++)
{
scanf("%d", &marks[counter]);
}
//Printing it returns correct values:
for (counter = 0; counter < size; counter++)
{
printf("%d\n", marks[counter]);
}
//Don't forget to free the array in the end
free(marks);
}
答案 1 :(得分:1)
请不要使用gets
。 It's dangerous。
对于您在scanf
示例中的错误,第一个问题是行
int size,counter,marks[size];
用未初始化的marks
值声明size
。尝试首先初始化size
,然后声明marks
数组。
您的第二个问题是scanf
格式化字符串。使用scanf
读取格式化的输入,而不输出提示。为此,请使用puts
或printf
。
这是一个完整的例子:
#include <stdio.h>
int main(void) {
int size;
printf("Enter a size value: ");
scanf("%d", &size);
int marks[size];
for (int i = 0; i < size; i++) {
printf("Enter element %d: ", i);
scanf("%d", &marks[i]);
}
printf("You entered: ");
for (int i = 0; i < size; i++) {
printf("%d ", marks[i]);
}
puts("");
return 0;
}
这是一个示例运行:
Enter a size value: 4
Enter element 0: 88
Enter element 1: 77
Enter element 2: 66
Enter element 3: 55
You entered: 88 77 66 55
如果您正在编写ANSI C-compatible code,则可以将动态内存与malloc
一起使用:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i, size, *marks;
printf("Enter a size value: ");
scanf("%d", &size);
if (size < 1) {
fprintf(stderr, "Invalid size specified\n");
exit(1);
}
marks = malloc(size * sizeof(int));
if (!marks) {
fprintf(stderr, "malloc failed\n");
exit(1);
}
for (i = 0; i < size; i++) {
printf("Enter element %d: ", i);
scanf("%d", &marks[i]);
}
printf("You entered: ");
for (i = 0; i < size; i++) {
printf("%d ", marks[i]);
}
free(marks);
puts("");
return 0;
}
答案 2 :(得分:1)
size
时, marks
可以具有任何值,因为它没有初始化。数组可能小于输入的大小,因此标记存储在未分配的内存中,从而给您带来错误。
这是一个可能的解决方案,但不能与严格的ISO C90一起编译。大概您的CodeBlocks使用GCC来接受可变长度数组以及混合的声明和代码。
#include <stdio.h>
int main(void) {
int size;
printf("enter size: ");
scanf("%d",&size);
int marks[size];
int counter;
for (counter = 0; counter < size; counter++) {
scanf("%d", &marks[counter]);
}
for (counter = 0; counter < size; counter++) {
printf("%d: %d\n", counter, marks[counter]);
}
return 0;
}
顺便说一句,如果您遇到运行时错误,请不要说“构建错误”。 ;-)