来自stdin的fgets()导致分段错误

时间:2016-01-15 09:49:13

标签: c

我正在尝试使用fgetsstdin获取一行,但我反复获取诊断“Segmentation fault(core dumped)”我认为是目的地不存在时的错误 - 这很奇怪,考虑到我正在分配Title

void getName(Song* songList, int globalCounter)
{
    char Title[100];
    printf("Title for deletion: ");
    fgets(Title,100,stdin);

    char *pos;
    if ((pos=strchr(Title, '\n')) != NULL)
        *pos = '\0';

    if (isalpha(Title[0]))
        Title[0] = toupper(Title[0]);

    printf(Title);
    remove_title(songList, globalCounter, Title);
}

1 个答案:

答案 0 :(得分:2)

  1. 您在堆栈上分配Title,这意味着它在getName函数之外变为无效。您发布的代码不会出现此问题,但我认为您的实际代码会在Title中的某处保存songList以供日后使用。 (当seeng更新代码时排除了,但remove_title函数内的失败并非不可能)

  2. 由于您未检查fgets的返回值,如果未输入任何字符串,则在未初始化的变量上运行strchr,可能会导致段错误。 (对于更新的代码仍然如此)

  3. printf(Title)是灾难的秘诀。如果Title恰好包含%个字符,printf会尝试访问不存在的参数,并且可能会失败。请改用printf("%s", Title)