[英]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個指針的數組,但是與此問題相關的指針沒有指向任何東西。 你需要malloc
之前呼吁指針一些內存fgets
,如
printf("Enter new subject name: ");
subjectName[numOfSubj] = malloc( 50 );
fgets(subjectName[numOfSubj], 50, stdin);
它在第一種情況下有效,因為您正在使用主題名稱初始化char數組,以便編譯器分配內存。
在USER情況下,您需要先分配內存,然后再從用戶那里獲取輸入。
fgets(subjectName [numOfSubj],50,stdin); //這里傳遞了null char數組
所以避免出錯
subjectName[numOfSubj] = malloc( 50 ); //memory allocation
fgets(subjectName[numOfSubj], 50, stdin);
並在每次使用完內存后free
內存(由malloc分配的內存)。
free(subjectName[numOfSubj] );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.