fgets()在多次使用时使C程序崩溃
我声明了一个数组,并填充了3个字符串(数学、物理、英语)。我使用fgets()将新主题添加到数组中,效果很好。但是,每当我复制同一段代码以从用户处获取另一主题时,程序就会崩溃 为什么会这样?如何从用户处获取字符串并将其添加到数组中fgets()在多次使用时使C程序崩溃,c,crash,fgets,C,Crash,Fgets,我声明了一个数组,并填充了3个字符串(数学、物理、英语)。我使用fgets()将新主题添加到数组中,效果很好。但是,每当我复制同一段代码以从用户处获取另一主题时,程序就会崩溃 为什么会这样?如何从用户处获取字符串并将其添加到数组中 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *subjectName[1000]; int numOfS
#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;
}
#包括
#包括
#包括
int main()
{
char*subjectName[1000];
int numosub=0;
int numOfUserAddedSubj=0;
subjectName[numofsubject]=“数学”;
numosub++;
subjectName[numofsubject]=“物理学”;
numosub++;
subjectName[NumofSubject]=“英语”;
numosub++;
//int k;
//对于(k=0;k请注意subjectName
是char*
类型的数组。
您的前3个字符串是静态定义的。
对于要通过fgets()
获取的字符串,需要先使用mallaoc
分配内存,然后才调用fgets()
比如:
subjectName[numOfSubj] = (char *) malloc(50*sizeof(char));
fgets(subjectName[numOfSubj], 50, stdin);
不要忘记在最后释放分配的内存。
请注意,您可能需要考虑不同的方法。您可以静态定义数组:<代码> char主题名称[1000 ] [ 50 ] < /代码>,并使用<代码> STRCYP()/<代码>以“数学”、“物理”和“英语”填充它。.您有一个包含1000个指针的数组,但是与此问题相关的指针没有指向任何东西。在调用fgets
之前,您需要malloc
为指针提供一些内存,例如
printf("Enter new subject name: ");
subjectName[numOfSubj] = malloc( 50 );
fgets(subjectName[numOfSubj], 50, stdin);
它在第一种情况下工作,因为您正在使用subject name初始化char数组,以便编译器分配内存
在用户案例中,您需要在从用户获取输入之前分配内存
fgets(subjectName[numofsubject],50,stdin);//这里传递了null字符
排列
所以要避免错误呢
subjectName[numOfSubj] = malloc( 50 ); //memory allocation
fgets(subjectName[numOfSubj], 50, stdin);
和free
内存(由malloc分配),只要您完成使用
free(subjectName[numOfSubj] );
subjectName[numofsubject]
这是一个未初始化的char*
变量。也就是说,您试图写入一个无效的地址。可以为每个char
缓冲区动态分配内存(例如subjectName[numofsubject]=malloc(50)
),也可以静态地将其声明为subjectName[1000][50]
。您正在将一个未初始化的指针传递给fgets
,该指针的使用方式与以前分配给字符串文本的指针不同。不太正确,这里的前3个指针指向字符串文本。@MichaelWalz问题是,“如何从用户处获取字符串并将其添加到数组?”是的,但在问题中,前3个指针并不指向任何内容,它们指向字符串文字。@MichaelWalz感谢您关注无关内容。我已更新了我的答案。非常感谢您的解释!现在可以使用了。:)