在C中,当使用sscanf时,对于format参数,使用:
之间存在差异%255[^\0]s
和
%255c
一个更快吗?以上其中一种会产生不同的结果吗?
答案 0 :(得分:6)
问题肯定是不 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'
之后有什么东西。由于格式说明符以[
开头,但不以匹配的]
结尾,因此它是无效的说明符。 “如果转换规范无效,行为未定义。”
这也适用于原始"%255[^\0]s"
:行为未定义。
以下是"%255s"
和"%255c"
"%255c"
不消耗前导空格。 "%255s"
会消耗无限制的前导空格并扫描它们,但不将它们保存到dest
。"%255c"
会扫描空格并将其保存到dest
。 "%255s"
,在找到非白色空格后,如果遇到空白区域,将停止扫描。dest
。"%255c"
不附加\0
,因此dest
应该处理255 char
。"%255s"
,如果它扫描至少1个字符,则会附加\0
,因此dest
应该处理256 char
。\0
在buf
的{{1}}停止时,扫描\0
时都不会扫描sscanf()
。 "%255c"
会扫描\0
中的fscanf()
。这种情况很不寻常,因为当文件中包含fscanf()
时\0
使用率不高。如果出现任何速度差异,当然它取决于实现。
答案 1 :(得分:1)
无法确定速度,但结果存在差异。
首先,%255c
将(假设您正在扫描的字符串中至少有255个字符)读取255个字符,无论它们是什么。另一方面,%255[^\0]s
最多可读取255个非空白字符。
其次,因为字符串已经被\0
终止,所以正则表达式的[^\0]
部分是多余的,因为sscanf
永远不会将空终止符视为字符串的一部分。