【问题标题】:C - strlen("288_882_288"+strlen("288_882_288") /2 = 6?C - strlen("288_882_288"+strlen("288_882_288") /2 = 6?
【发布时间】:2017-01-27 00:52:14
【问题描述】:

所以我正在学习嵌入式系统课程,我们正在使用 C。 这是第 2 周,所以我们只是在刷新我们的 C 代码内存。

这段代码是如何打印出数字 6 的?幕后发生了什么?

int main (void) {
    char msg[] = "288_882_288";
    int my_length = 0xFFFFFFFF;
    my_length = strlen(msg+strlen(msg) /2);

    printf("%d",my_length);//prints 6
    fflush(stdout);
}

谢谢!

【问题讨论】:

  • 除法不是优先于加法吗?
  • int my_length = 0xFFFFFFFF; 只是无用的代码,因为您会立即在下一行将0xFFFFFFF 替换为不同的值,顺便说一句。
  • @KenWhite:没用,但我认为 OP 想确保获得不同的价值。当然,尽管该值可能会溢出 int,并且编译器可能会完全消除初始化。
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及重现它所需的最短代码在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • @Olaf:即便如此,这也是一个浪费的操作。当它立即被以下赋值替换时,它绝对没有任何作用。这是一个无用的任务。它表现出与int my_length; 没有不同的行为,是吗?就算溢出来了?

标签: c arrays string pointers strlen


【解决方案1】:

那是因为:

strlen(msg) = strlen("288_882_288") = 11
strlen(msg) / 2 = 5 (floor value taken)

msg + strlen(msg) / 2 is the same as msg + 5 == &msg[5]    
strlen(msg+strlen(msg) /2) = strlen(&msg[5]) = strlen("82_288") = 6

【讨论】:

  • 好的,谢谢。我想我忘记了 C 与 java 的连接方式不同。
  • 是的。另请注意,即使在 C++ 中,由于运算符重载,“+”符号也可能表示其他含义。在 C 语言中,“+”符号除了加法之外没有任何意义。
  • @user1952500 在 C++ 中没有任何意义,因为运算符只能在用户定义的类型上重载
  • @M.M 之前的评论试图建立从 Java 字符串到 C 中的字符串文字的关系。本着同样的精神,我谈到了 C++ 中的另一个字符串库,它使用“+”符号附加。这些都没有直接可比性。
【解决方案2】:

参考

strlen(“288_882_288” + strlen(“288_882_288”) / 2)

版本,C 中的字符串字面量是数组类型的对象。与任何其他数组类型的对象一样,它会衰减为指针类型,在这种情况下为char *。指针算术可以以通常的方式与该指针一起使用。所以,

"288_882_288" + strlen("288_882_288") / 2

子表达式产生一个char * 指针,大约指向"288_882_288" 字符串的中间(位置5)。从该位置获取另一个 strlen 将产生字符串剩余尾部的长度,在您的情况下恰好是 6。

【讨论】:

    【解决方案3】:

    这个字符串字面量“288_882_288”(用于初始化数组)的大小由函数 strlen 返回等于 11。

    这个表达式msg+strlen(msg) /2 产生一个指针,该指针指向具有索引5 的字符串字面量(更准确地说是数组msg)的元素,因为11 / 2 等于5。

    因此,从索引5 开始的字符串文字部分的长度等于6。

                      6 characters  
                        _____
                       |     |
    char msg[] = "288_882_288";
                       ^
                       |
                    msg + strlen( msg ) / 2
    

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 1970-01-01
      • 2011-03-15
      • 2023-03-17
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多