为功能获取在代码块中生成错误

时间:2019-06-07 18:29:25

标签: c codeblocks

我想为循环次数创建一个简单的变量,所以我尝试了代码

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编译器。

3 个答案:

答案 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)

请不要使用getsIt's dangerous

对于您在scanf示例中的错误,第一个问题是行

int size,counter,marks[size];

用未初始化的marks值声明size。尝试首先初始化size,然后声明marks数组。

您的第二个问题是scanf格式化字符串。使用scanf读取格式化的输入,而不输出提示。为此,请使用putsprintf

这是一个完整的例子:

#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;
}

顺便说一句,如果您遇到运行时错误,请不要说“构建错误”。 ;-)