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;
}
请注意 subjectName
是 char*
类型的数组。
您的前 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] );
我声明了一个数组并填充了 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;
}
请注意 subjectName
是 char*
类型的数组。
您的前 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] );