【问题标题】:sscanf not reading numberssscanf 不读取数字
【发布时间】:2020-11-19 13:37:51
【问题描述】:

C 中的一个新手正在尝试使用 sscanf() 从字符串中提取两个数字。这些数字应从格式为“7-12”的字符串中解析,结果应为firstNode = 7secondNode = 12。所以我想得到数字,减号可以理解为数字分隔符。我当前的实现类似于我在this SO answer上找到的示例:

void extractEdge(char *string) {
    int firstNode = 123;
    int secondNode = 123;

    sscanf(string, "%*[^0123456789]%u%*[^0123456789]%u", &firstNode, &secondNode);
    printf("Edge parsing results: Arguments are %s, %d, %d", string, firstNode, secondNode);
}

但是如果我执行上面的代码,两个整数的初始值总是 123。请注意,string 的输出给出了正确的输入字符串,所以我认为无效字符串不可能是导致此问题的可能原因。

任何想法为什么代码不起作用?提前感谢您的帮助。

【问题讨论】:

  • %*[^0123456789] 必须匹配至少一个字符。如果您的字符串以7 开头,则意味着%*[] 失败,并使sscanf 返回。为什么不只是scanf("%d-%d"
  • 行得通!没想到 posix 有时会那么容易,关于互联网上的例子。

标签: c scanf


【解决方案1】:

%*[^0123456789] 需要一个或多个非数字字符,但您输入的7-12 的第一个字符是数字。这使得sscanf() 停在那里什么也不读。

删除它并使用"%d%*[^0123456789]%d" 作为格式说明符来处理7-12

另请注意,读取十进制 int 的正确格式说明符是 %d,而不是 %u%u 用于阅读unsigned int

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多