假设我想读取stdin
,并让用户输入包含空字符的字符串。这可以通过字符串输入函数实现吗fgets
or gets_s
?或者我必须使用例如fgetc
or fread
?
Someone here想做这个。
For fgets
, yes. fgets
被指定为如同重复的行为fgetc
并将结果字符存储到数组中。对于空字符没有特殊规定,只是除了读取的字符外,在末尾(最后一个字符之后)存储一个空字符。
然而,要成功区分嵌入的空字符和终止符,需要做一些工作。
首先,预填充缓冲区'\n'
(例如使用memset
)。现在,当fgets
返回,寻找第一个'\n'
在缓冲区中(例如使用memchr
).
如果没有'\n'
, fgets
由于填满输出缓冲区而停止,除了最后一个字节(空终止符)之外的所有内容都是从文件中读取的数据。
如果第一个'\n'
紧接着是'\0'
(空终止),fgets
由于到达换行符而停止,并且从文件中读取该换行符之前的所有内容。
如果第一个'\n'
后面没有一个'\0'
(或者在缓冲区的末尾,或者后面跟着另一个'\n'
) then fgets
由于 EOF 或错误而停止,并且直到该字节之前的所有内容'\n'
(这必然是一个'\0'
)但不包括它,是从文件中读取的。
For gets_s
,我不知道,我强烈建议不要使用它。 Microsoft 的附件 K“*_s”函数唯一广泛实现的版本甚至不符合他们纳入 C 标准附件的规范,并且据报道存在可能导致此方法不起作用的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)