关于fgets()函数是否始终添加空终止符的技术问询
fgets 函数行为详解
你的理解大部分是正确的,下面逐个拆解你的问题:
当输入"car"并按下回车时,
fgets会读取输入的'c'、'a'、'r'以及换行符'\n',然后在末尾添加空终止符'\0'。此时line[5]的内容确实是{'c','a','r','\n','\0'},这个判断没问题。当输入"carb"时,因为你给的缓冲区大小是5(
line[5]),fgets的第二个参数指定了最多读取5-1=4个字符(必须留一个位置给'\0')。所以不管你输入后是否按下回车,fgets只会读取前4个字符'c'、'a'、'r'、'b',然后在末尾添加'\0',最终数组内容就是{'c','a','r','b','\0'},这个判断也正确。
关于你最关心的核心问题:fgets总会向接收的字符数组中写入空终止符'\0',这是C标准明确规定的行为——只要你传入的缓冲区有效,且指定的size参数大于0:
- 如果
size为1,fgets会直接在缓冲区中写入'\0'; - 如果读取到了任意数量的字符(包括换行符),会在读取内容的末尾追加
'\0'; - 只有当在读取第一个字符之前就遇到EOF时,缓冲区不会被修改,
fgets返回NULL,但这种情况是唯一不会写入'\0'的场景。
结合你的代码来看,只要用户输入了至少一个字符,line数组的最后一位一定会被fgets设为'\0',不会出现缓冲区没有终止符的情况。
内容的提问来源于stack exchange,提问作者cosman
相关产品推荐
相关产品推荐

