【问题标题】:STRLEN printf on two lines? [closed]STRLEN printf 在两行? [关闭]
【发布时间】:2010-10-23 21:07:58
【问题描述】:

有人可以向我解释以下发生的事情吗?

unsigned int i;
i = strlen("testData");
printf("%d\n", i);

Output:
8
5

为什么要打印额外的 5?

[更新:]看了评论后,我傻傻地意识到5是从哪里来的,对不起!

【问题讨论】:

  • 可以发一个完整的程序吗?
  • 请花点心思学习:始终提供一个小型、独立、可编译(当然,有关编译器错误的问题除外),该程序会展示您无法理解的行为。 IME,大多数情况下,创建这样的重现案例会让您自己发现错误并防止您浪费每个人的时间。如果不是 - 好吧,那么您已经创建了 repro 案例来这里询问。现在做一个好公民,删除这个无用的问题。

标签: c++ printf strlen


【解决方案1】:

strlen 代表字符串长度。现在,让我们看看……“testData”。

1 - 't' 2 - 'e' 3 - 's' 4 - 't' 5 - 'D' 6 - 'a' 7 - 't' 8 - 'a'.

我们数了 8 个。
现在我 8 岁了。

So, printf("%d\n", i);
打印 8。

然后你的程序中有一些代码打印 5。不能告诉你为什么,因为我看不到代码

【讨论】:

    【解决方案2】:

    一种可能的解释是您有未定义的行为,因为您正在使用带符号整数 (%d) 的格式规范,但传递了 unsigned int 参数。正确的printf 调用是:

    printf("%u\n", i);
    

    虽然不太可能,但一种可能的解释是您的实现中未定义的行为导致打印了额外的 5 个。

    【讨论】:

    • 真的是未定义的行为吗?因为标准说 int 和 unsigned int 都具有相同的位表示......只是古玩,是否可以从标准证明这是 UB?
    • @Armen Tsirunyan:您必须参考 C 标准,因为这是定义 fprintf/printf 函数接口的地方。 ISO/IEC 9899:1999 7.19.6.1 对转换说明符 di 说(转述):“int 参数是......”和更高版本的“如果任何参数不是相应转换的正确类型规范,行为未定义”。虽然我手头没有 C90,但我不相信从那以后这方面发生了变化。
    【解决方案3】:

    这段代码 sn-p 应该只打印 8。除此代码部分之外还有其他内容可以打印 5

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多