%255 [^ \ 0] s和%255c之间的差异

时间:2013-08-02 19:31:03

标签: c format scanf

在C中,当使用sscanf时,对于format参数,使用:

之间存在差异
%255[^\0]s

%255c

一个更快吗?以上其中一种会产生不同的结果吗?

2 个答案:

答案 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"

之间的突出问题
  1. "%255c" 消耗前导空格。 "%255s"会消耗无限制的前导空格并扫描它们,但将它们保存到dest
  2. "%255c"会扫描空格并将其保存到dest"%255s",在找到非白色空格后,如果遇到空白区域,将停止扫描。
  3. 两者最多可扫描255个字符,并将扫描的字符放入dest
  4. "%255c" 附加\0,因此dest应该处理255 char
  5. "%255s",如果它扫描至少1个字符,则会附加\0,因此dest应该处理256 char
  6. 当扫描\0buf的{​​{1}}停止时,扫描\0时都不会扫描sscanf()"%255c"会扫描\0中的fscanf()。这种情况很不寻常,因为当文件中包含fscanf()\0使用率不高。
  7. 如果出现任何速度差异,当然它取决于实现。

答案 1 :(得分:1)

无法确定速度,但结果存在差异。

首先,%255c将(假设您正在扫描的字符串中至少有255个字符)读取255个字符,无论它们是什么。另一方面,%255[^\0]s最多可读取255个非空白字符。

其次,因为字符串已经被\0终止,所以正则表达式的[^\0]部分是多余的,因为sscanf永远不会将空终止符视为字符串的一部分。