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

C 来自stdin的fgets()导致分段错误,c,C,我试图使用fgets从stdin获取一行代码,但我反复得到诊断“分段故障(堆芯转储)”,我认为这是目标不存在时的错误-考虑到我正在分配Title,这很奇怪 void getName(Song* songList, int globalCounter) { char Title[100]; printf("Title for deletion: "); fgets(Title,100,stdin); char *pos; if ((pos=strchr(T

我试图使用
fgets
stdin
获取一行代码,但我反复得到诊断“分段故障(堆芯转储)”,我认为这是目标不存在时的错误-考虑到我正在分配
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);
}
  • 您正在堆栈上分配
    Title
    ,这意味着它在
    getName
    函数之外变得无效。您发布的代码没有这个问题,但我假设您的实际代码将
    标题
    保存在
    歌曲列表
    中的某个位置,以供以后使用。(查看更新的代码时排除,尽管
    remove\u title
    功能中的故障并非不可能)

  • 由于未检查来自
    fgets
    的返回值,如果未输入字符串,则对未初始化的变量运行
    strchr
    ,可能导致segfault。(对于更新后的代码仍为真)

  • printf(Title)
    是造成灾难的一种方法。如果
    Title
    碰巧包含
    %
    字符,
    printf
    将尝试访问不存在的参数,并且可能会失败。改用
    printf(“%s”,标题)


  • 在上一个问题中,您也将
    globalCounter
    传递给函数。别这样!我看不出有什么问题。请发布完整的代码我看这里发布的代码没有任何问题,但是
    getName
    函数毫无意义。
    getName
    函数从stdin读取行,并将其存储在局部变量
    Title
    ;从
    getName
    函数返回后,存储在
    Title
    中的行就消失了。@unicornication我们无法帮助您,因为您的问题中没有足够的信息。再次使用调试器。你不知道如何使用调试器?那么现在是开始学习的时候了;是可利用的。使用
    printf(“%s”,标题)我更新了我的代码以显示它的完整性,但是,如果我用
    scanf()
    替换
    fgets()
    ,它可以正常工作,除非它遇到空白。假设相同吗?@unicornication可能您的remove_title()函数也有错误。你有没有试着对那个电话进行评论?您可能还应该检查fgets()是否真的成功,并且应该检查您在剥离\n之后是否真的读入了至少1个字符。@nos实际上
    fgets
    甚至不能保证将
    \0
    字节输出到
    Title
    ,更不用说
    \n
    @dmitrygrioyev如果fgets()成功,是的。它绝对保证以nul结尾的字符串。在剥离之前,代码会检查\n是否也存在。@否问题是,代码不会检查
    gets
    是否成功。