【问题标题】:The width option of sscanf does not worksscanf 的宽度选项不起作用
【发布时间】:2017-10-15 05:23:26
【问题描述】:

我想使用 sscanf 的宽度选项 (http://en.cppreference.com/w/c/io/fscanf) 来控制要读取的最大字节数。但以下读取超过 3 个字节。

#include <stdio.h>

int main() {
  long long ll;
  char str[4];
  int pos;  
  sscanf(" 281", "%3llx%n", &ll, &pos);
  printf("%llx %d\n", ll, pos);
  sscanf(" 281", "%3s%n", &str, &pos);
  printf("%s %d\n", str, pos);
  return 0;
}

它打印出以下内容。

281 4
281 4

我以为它会打印出来

28 3
28 3

这是 sscanf 的正确用法吗? fscanf 以类似的方式工作。

【问题讨论】:

  • 宽度是指单个字段
  • @AdrianoRepetti 我不知道它是否可以按我的预期工作。我的目标是以某种格式读取接下来的 3 个字节。 sscanf 是否总是忽略空格并计算空格后的 3 个字节?
  • 不,宽度不适用于整个格式字符串,而是适用于单个特定字段(您可以在不同字段中指定多个宽度)。如果您想要原始字节数,您可以读取字符串(以便稍后解析)
  • @AdrianoRepetti sscanf 中的字段是用空格分隔的吗?
  • 也许%3[ 0-9] 就是你想要的。

标签: c scanf


【解决方案1】:

某些(大多数)格式会隐式跳过空格(基本上除了%c%[ 之外的所有格式)。跳过的空格不计入最大字段宽度。

【讨论】:

  • “(除 %c、%[ 和 %n 之外的所有内容)”另见 C11 §7.21.6.2 8
猜你喜欢
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
相关资源
最近更新 更多