【问题标题】:sscanf behaviour / return valuesscanf 行为/返回值
【发布时间】:2013-05-27 19:45:59
【问题描述】:

我是一名学习 C 的新手,并试图从在线讲座中理解以下代码。它在字符串中扫描一个整数;如果遇到字符,则 sscanf 失败。

int n; char c;
if (sscanf(string, " %d %c", &n, &c) == 1)
    //return the integer

else
    // fail

我已经阅读了 sscanf 的手册页,但仍然对检查返回值以及为什么此代码有效感到困惑。他们声明“这些函数返回分配的输入项的数量”。

如果 sscanf 只遇到字符,它会将它们写入 &c...但在这种情况下不会写入 &n。在这种情况下,我会认为 sscanf 的返回值仍然是 1?

【问题讨论】:

  • sscanf 不会跳过%d%c。如果没有先遇到数字,则返回 0。
  • 由于某种原因,sscanf 严格按顺序(按格式字符串)执行此操作的事实完全让我无法理解。谢谢!

标签: c scanf


【解决方案1】:

如果 sscanf 已成功读取 %d 而没有其他内容,它将返回 1(已分配一个参数)。如果数字前有字符,它将返回0(没有分配参数,因为需要先找到一个不存在的整数)。如果有一个带有附加字符的整数,它将返回2,因为它能够分配两个参数。

【讨论】:

  • 谢谢。我认为这种行为只是为了存储而不管顺序,因此造成了混乱。
【解决方案2】:

您的sscanf(string, " %d %c") 将返回EOF012

2: 如果您的输入与以下内容匹配
[可选空格][十进制数字1][可选空格][任意字符][后面的数据不读]

1: 如果您的输入在上面失败但与以下匹配
[可选空格][十进制数字1][可选空格][没有更多可用数据]

0:如果您的输入在空格和可选符号之后没有找到数字:示例:"z""-"

EOF:如果输入为空"" 或只有空格2


1 十进制数字前面可以有一个符号字符:+-

2或罕见的输入错误。

【讨论】:

    【解决方案3】:

    您始终可以通过将函数放入printf 语句中来检查函数返回的内容,如下所示:

    printf("%d",sscanf(string, " %d %c", &n, &c));
    

    这可能会通过在您的终端上打印出sscanf 的返回值来消除您的疑问。

    你也可以看看这个:cplusplus : sscanf

    希望有所帮助:)

    【讨论】:

    • 您的意思是printf("%d\n", sscanf(string, " %d %c", &n, &c)); 吗?
    • 是的,谢谢提及:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多