fgets()函数什么时候返回有效地址,什么时候返回空地址。为什么输入一次很的长字符串(长度大于数组长度)时,第二次输出的第一个字符是第一次输出的最后一个字符的下一个字符。
该回答通过自己思路及引用到各个渠道搜索综合及思考,得到内容具体如下:
在C语言中,fgets()函数返回一个指向字符串的指针,该字符串包含读取的字符。fgets()函数返回有效地址的情况有两种:
1. 成功读取到输入字符串:当fgets()函数成功读取到输入字符串时,它会返回指向输入字符串的指针。在这种情况下,输入字符串将存储在调用fgets()函数时提供的缓冲区中。
2. 读取到了文件结尾或者出现了错误:当fgets()函数读取到了文件结尾或者出现了错误时,它会返回一个空指针。在这种情况下,输入字符串将为空。
在输入一次很长的字符串时,如果该字符串的长度大于输入缓冲区的长度,则fgets()函数会将缓冲区填满,并将剩余的字符留在输入流中。因此,第二次调用fgets()函数时,它会读取到输入流中剩余的字符,而不是从输入流的开头开始读取。这就是为什么第二次输出的第一个字符是第一次输出的最后一个字符的下一个字符的原因。
为了避免这个问题,我们可以使用一些方法来清空输入缓冲区。例如,在读取完一个很长的字符串之后,我们可以使用下面的代码来清空输入缓冲区:
int c;
while ((c = getchar()) != '\n' && c != EOF);
这个代码片段使用getchar()函数来读取输入缓冲区中的字符,直到读取到换行符或文件结尾为止。这样可以清空输入缓冲区,使得下一次调用fgets()函数时可以从输入流的开头开始读取。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
不知道你这个问题是否已经解决, 如果还没有解决的话:
- 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7588760
- 这篇博客你也可以参考下:浅谈使用C库函数之gets和fgets遇到的坑——字符串长度多出来的1是哪来的
- 除此之外, 这篇博客: 关于C语言fgets函数要注意的地方中的 关于C语言fgets函数要注意的地方 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
- fgets函数一般用来读入文件内容,每次读一行,然后存入缓存区
- 有人问那怎么读下一行,直至读完整个文本文件的内容,其实很简单,只要循环用fgets就行,如果你这次把第一行读完了,那么下一次文件指针就会从第二行的开头开始,下次用fgets就会从第二行开始读啦!

- 值得一提的是,当fgets函数读完一行,会自动添加一个反斜杠0,即 ‘\0’
- fgets函数的第一个参数表示文件读入之后存储的地方也就是缓存区,一般是一个数组,中间的参数表示你要一次读入多大的内容,第三个参数表示文件fp,在这之前要先打开文件,就是fp=fopen()之类的格式
- fgets函数停止的条件可能有两个,第一个是遇到了反斜杠n,表示这一行结束了,第二个就是读入的字符数量已经到达了(中间参数-1),为什么减一是因为最后要留一个位置给 \0(第3点已经说明)
- 当fgets执行一次但一行的字符还没有读完时,下一次会接着读那一行,直到遇到第5点说的两种结束条件
- 如果是把文件内容读入数组缓存区,第二次会覆盖第一次相对应位置的内容,因为每次都是从数组的开始地址存储文件内容,所以如果是用指针控制数组内容的提取(把内容写到另一个文件之类的),每次fgets之后数组指针都要置零,否则就会出现下一行前面的一些字符读不进来或者所有字符都没读到直接读到了反斜杠0(具体读到了什么可以debug追踪一下相应的变量)
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^