【问题标题】:sscanf - How should I handle this?sscanf - 我应该如何处理这个?
【发布时间】:2018-02-21 14:23:35
【问题描述】:

我正在尝试使用 sscanf 解析一个 ascii 字符串。字符串如下所示:

"Param1","Param2","","Param4"

问题是可能有一个 Param3 但不能保证。我也对 Param3 不感兴趣,但必须为它做好准备,以防它出现。

我正在通过以下方式解析参数:

char ParamStr[] = "\"Param1\",\"Param2\",\"\",\"Param4\"";
char Param1[10];
char Param2[10];
char Param4[10];

sscanf(ParamStr, "\"%[^\"]\", \"%[^\"]\", \"%*[^\"]\", \"%[^\"]\"", Param1, Param2, Param4);

但是当我解析 Param3 时,我得到的 Param4 的结果不正确。

处理像 Param3 这样的“动态”参数的正确方法是什么?

【问题讨论】:

  • 可能不是sscanf() 的理想任务。
  • 在逗号之间进行解析是个好主意,而且效果很好。谢谢。

标签: c scanf


【解决方案1】:

您可以使用来自scanf 的返回值并使用两种不同的格式字符串:

// Try to scan all 4....
int count = sscanf(ParamStr, "\"%[^\"]\",\"%[^\"]\",\"%[^\"]\",\"%[^\"]\"",
    Param1, Param2, Param3, Param4);
// Didn't get 4? Try for 3 using a different format string
if (4 != count) {
    count = sscanf(ParamStr, "\"%[^\"]\",\"%[^\"]\",\"\",\"%[^\"]\"", 
        Param1, Param2, Param4);
}

【讨论】:

  • 另一种难以阅读的格式是利用 string literal 连接。 #define PFMT "\"%[^\"]\"sscanf(ParamStr, PFMT "," PFMT "," PFMT "," PFMT, ...
猜你喜欢
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
相关资源
最近更新 更多