fgets() 多次使用时会导致 C 程序崩溃

fgets() crashing C program when used more than once

我声明了一个数组并填充了 3 个字符串(数学、物理、英语)。我使用 fgets() 获取新主题以添加到数组中,这工作正常。但是,每当我复制相同的代码块以从用户那里获取另一个主题时,程序就会崩溃。

为什么会这样?如何从用户获取字符串并将其添加到数组?

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

int main()
{
    char *subjectName[1000];
    int numOfSubj = 0;
    int numOfUserAddedSubj = 0;

    subjectName[numOfSubj] = "Math";
    numOfSubj++;
    subjectName[numOfSubj] = "Physics";
    numOfSubj++;
    subjectName[numOfSubj] = "English";
    numOfSubj++;

//int k;
//for(k=0; k<1; k++)
//{
    // add user
    printf("Enter new subject name: ");
    fgets(subjectName[numOfSubj], 50, stdin);
    numOfUserAddedSubj++;
    numOfSubj++;
//}


// add another user
/*printf("Enter new subject name: ");
fgets(subjectName[numOfSubj], 50, stdin);
numOfUserAddedSubj++;
numOfSubj++;*/



// display content of array
int i;
for(i=0; i < ((strlen(subjectName))+numOfUserAddedSubj); i++)
{
    printf("%s\n", subjectName[i]);
}


    return 0;
}

请注意 subjectNamechar* 类型的数组。 您的前 3 个字符串是静态定义的。 对于要通过 fgets() 获取的字符串,您需要先使用 mallaoc 分配内存,然后才调用 fgets().

类似于:

subjectName[numOfSubj] = (char *) malloc(50*sizeof(char));
fgets(subjectName[numOfSubj], 50, stdin);

不要忘记free最后分配的内存。 请注意,您可能需要考虑不同的方法。您可以静态定义数组:char subjectName[1000][50] 并使用 strcpy() 将其填充为 "Math"、"Physics" 和 "English".

您有一个包含 1000 个指针的数组,但与此问题相关的指针没有指向任何内容。在调用 fgets 之前,您需要 malloc 一些指针内存,例如

printf("Enter new subject name: ");
subjectName[numOfSubj] = malloc( 50 );
fgets(subjectName[numOfSubj], 50, stdin);

它在第一种情况下工作,因为您正在使用主题名称初始化 char 数组,以便编译器分配内存。

在 USER 情况下,您需要在获取用户输入之前分配内存。

fgets(subjectName[numOfSubj], 50, stdin); //Here you passed null char array

所以为了避免错误做

subjectName[numOfSubj] = malloc( 50 ); //memory allocation

 fgets(subjectName[numOfSubj], 50, stdin);

free 内存(由 malloc 分配),只要你用完它。

free(subjectName[numOfSubj] );