C语言 为什么我会收到分段错误


#include<stdio.h>
#include<string.h>
void main()
{
int entry,i;
printf("nPlease indicate the number of records you want to enter :n");
scanf("%d",entry);
char ent[entry][100000];
printf("nPlease input records of students (enter a new line after each record), with following format first name last name score n");
for(i=0;i<entry;i++)
    {
    gets(ent[i]);
    printf("%s",ent[i]);
    }
}

以下是接受学生数据,名字姓氏然后得分的代码。

main应该返回int,而不是void

int main(void) {
    /* ... */
}

scanf("%d",entry);

scanf 期望对应于"%d"格式说明符的参数是int *。但是,您的论点是int.也许你的意思是:

scanf("%d",&entry);

在这一点上,你真的应该检查scanf的返回值。据您所知,用户没有输入任何数字。

if (scanf("%d", &entry) != 1) {
    exit(0);
}

实际上,这仍然允许用户输入负数。你见过负数项目的数组吗?对我来说似乎也很奇怪...我认为size_tint更合适的类型(因此,您需要使用 %zu 格式说明符(......

最后但并非最不重要的一点是,gets已被弃用,因为它无法防止用户溢出缓冲区,这可能会导致段错误。


#include <stdio.h>
#include <string.h>
int main(void)
{
    size_t entry;
    printf("nPlease indicate the number of records you want to enter :n");
    if (scanf("%zu",&entry) != 1)
    {
        exit(0);
    }
    char ent[entry][100000];
    printf("nPlease input records of students (enter a new line after each record), with following format first name last name score n");
    for(size_t i=0; i<entry; i++)
    {
        fgets(ent[i], sizeof ent[i], stdin);
        printf("%s",ent[i]);
    }
}
  1. 您应该使用int main()而不是void main
  2. 当你使用你应该scanf("%d",&entry)而不是scanf("%d",entry),SCANF需要的是一个地址。
  3. 你不应该使用gets(),这很危险,试试fgets()
scanf("%d",entry);     //scanf("%d",&entry)
char ent[entry][100000]; //error

当你在编译时无法知道数组的长度时,你应该使用 malloc 来获取数组

错误在于 scanf 使用 scanf("%d",&entry) 而不是 scanf("%d",entry);

建议:使用 int 作为main的返回类型

相关内容

  • 没有找到相关文章

最新更新