簡體   English   中英

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個指針的數組,但是與此問題相關的指針沒有指向任何東西。 你需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM