【问题标题】:Why sscanf does not work for blank string?为什么 sscanf 不适用于空白字符串?
【发布时间】:2021-01-08 15:23:19
【问题描述】:

我的 sscanf 函数有问题...

这是我的代码:

char str[]="Andrew;;;3454";
char name[20] = {0};
char city[20] = {0};
char age[5] = {0};
char hasDegree[20] = {0};

sscanf(str,"%[^;];%[^;];%[^;];%[^;]",name,city,age,hasDegree);

printf("%s is %s Years Old and live in %s at %s degrees",name,age,city,hasDegree);

输出:Andrew is Years Old and live in at degrees

如您所见,打印的是“Andrew”但不是“3454”(因为之前有2个空白?)

请问如何解决?

我自愿用 char 声明了所有内容:)

谢谢!

【问题讨论】:

  • 如果您需要任何健壮性解析数据,请不要使用任何版本的scanf()
  • 你建议我现在用什么?我听说过 strtok
  • hereherehere
  • 我使用了 strsep,当我打印时,它可以工作!但是如何将每个分隔的字符串保存在变量中? (姓名、城市等)我想使用 typedef 结构,例如: typedef struct identity{char name[20].......}identity;

标签: c scanf


【解决方案1】:

[ 转换匹配 非空 字符集。在读取到达3454 字段之前,空字段会导致转换失败。

总的来说,我发现scanf 系列函数很难使用,尤其是在需要进行错误恢复时(例如,在这里您可以检查成功读取的字段数的返回值,但恢复会更复杂而不是一开始就一一阅读)。我建议使用strtokstrsep(如果可用)来解析字段。或者,如果您有其他原因使用scanf,请一次读取一个字段,然后将读取位置移到下一个;

【讨论】:

  • 好的,谢谢,但是strtok会忽略连续的分隔符,怎么解决?
  • @Esref strsep 是支持空字段的非标准(但广泛可用)替代品。但是您可以非常轻松地手动解析它,只需找到下一个; 字符(手动或使用strchr)。如果字符串是可编辑的(就像您的示例一样),您可以轻松地将下一个 ; 替换为 \0,复制字符串,然后将读取位置推进到终止符之后的位置(如果它是 ;,如果是原来的\0,你就完了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
相关资源
最近更新 更多