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
是否成功。