在 C 中,使用 sscanf 时,对于格式参数,使用之间是否有区别:
%255[^\0]s
和:
%255c
一个更快吗?以上其中一项会给出不同的结果吗?
问题当然不是OP的意图。
OP要求sscanf(buf, format, dest)
格式之间的差异
"%255[^\0]s" // a seemingly format specifier %255[^\0] and the letter 's'
"%255c"
当然,OP想要sscanf(buf, format, dest)
格式之间的区别
"%255[^\0]" // a seemingly format specifier %255[^\0]
"%255c"
或者
"%255s" // format specifier %255s
"%255c"
这"%255[^\0]"
不是人们可能认为的格式。这与格式相同"%255[^"
。 sscanf()
不知道在显式空字符之后有什么东西'\0'
。由于格式说明符以 a 开头[
但不以 match 结尾]
,因此它是无效说明符。“如果转换规范无效,则行为未定义。”
这也适用于原始"%255[^\0]s"
:行为未定义。
以下是和之间的突出"%255s"
问题"%255c"
"%255c"
不消耗前导空格。 "%255s"
确实会消耗无限的前导空白,扫描它们,但不会将它们保存到dest
."%255c"
确实扫描空白并将它们保存到dest
. "%255s"
,在找到非空白区域后,如果遇到空白区域将停止扫描。dest
."%255c"
不附加 a所以应该处理 255 。\0
dest
char
"%255s"
,如果它扫描至少 1 个字符,将附加 a \0
,因此dest
应该处理 256 char
。\0
因为扫描在中buf
停止。 将扫描一个in 。这是不寻常的,因为当文件中有文件时使用不多。\0
sscanf()
"%255c"
\0
fscanf()
fscanf()
\0
如果发生任何速度差异,当然它取决于实现。
不能肯定地说速度,但结果有所不同。
首先,%255c
将(假设您正在扫描的字符串中至少有 255 个字符)读取 255 个字符,无论它们是什么。%255[^\0]s
另一方面,将读取多达 255 个非空白字符。
其次,因为字符串已经被 终止\0
,正则表达式的[^\0]
部分是多余的,因为sscanf
永远不会将空终止符视为字符串的一部分。