1

在 C 中,使用 sscanf 时,对于格式参数,使用之间是否有区别:

%255[^\0]s

和:

%255c

一个更快吗?以上其中一项会给出不同的结果吗?

4

2 回答 2

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'。由于格式说明符以 a 开头[但不以 match 结尾],因此它是无效说明符。“如果转换规范无效,则行为未定义。”

这也适用于原始"%255[^\0]s"行为未定义

以下是和之间的突出"%255s"问题"%255c"

  1. "%255c" 消耗前导空格。 "%255s"确实会消耗无限的前导空白,扫描它们,但不会将它们保存到dest.
  2. "%255c"确实扫描空白并将它们保存到dest. "%255s",在找到非空白区域后,如果遇到空白区域将停止扫描。
  3. 两者都将扫描最多 255 个字符并将扫描的字符放入dest.
  4. "%255c"不附加 a所以应该处理 255 。\0destchar
  5. "%255s",如果它扫描至少 1 个字符,将附加 a \0,因此dest应该处理 256 char
  6. 两者都不会扫描 a\0因为扫描在中buf停止。 将扫描一个in 。这是不寻常的,因为当文件中有文件时使用不多。\0sscanf()"%255c"\0fscanf()fscanf()\0

如果发生任何速度差异,当然它取决于实现。

于 2013-08-03T02:37:25.767 回答
1

不能肯定地说速度,但结果有所不同。

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

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

于 2013-08-02T19:41:14.177 回答