C - strlen(" 288_882_288" + strlen(" 288_882_288")/ 2 = 6?

时间:2017-01-27 00:52:14

标签: c arrays string pointers strlen

所以我参加了嵌入式系统课程,我们正在使用C语言。 它是第二周,所以我们只是刷新我们的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);
}

谢谢!

3 个答案:

答案 0 :(得分:7)

那是因为:

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

答案 1 :(得分:1)

此字符串文字" 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

答案 2 :(得分:1)

参考

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。