Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fgets()在多次使用时使C程序崩溃_C_Crash_Fgets - Fatal编程技术网

fgets()在多次使用时使C程序崩溃

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

我声明了一个数组,并填充了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;
}
#包括
#包括
#包括
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感谢您关注无关内容。我已更新了我的答案。非常感谢您的解释!现在可以使用了。:)