会打印什么?

What would be printed?

你能解释一下为什么下面程序的输出是1吗?

const char *str = "mms";

printf("%d\n", strlen(str + 2));

return 0;

如果我加1,结果就是2。

嗯,strlen 从您传递的指针开始计数,直到找到 NULL 或 [=11=] 字符。

所以str+2指向字母s所以在字符串末尾之前只有一个字母; str+1 指向 m 等...你得到 2

以下指令

 printf("%d\n", strlen(str));

会打印3,因为它是字符串"mms".

的长度

我们记住str指向的字符串是这样存储的

------------------
| m | m | s | [=11=] |
------------------

所以str+1是指向字符串第二个元素的指针(相当于&(str[1])str+2指向第三个元素(相当于&(str[2]),

str+2指向的字符串是什么?是"s"。所以它的长度是1.


如果你的目的是在str的长度上加上2,你要注意括号的使用:

printf("%d\n", strlen(str)+2);

这样strlen的参数就是str,返回的长度加上2

对于初学者来说,这个电话

printf("%d\n", strlen(str + 2));

可以调用未定义的行为,因为根据 C 标准(7.21.6.1 fprintf 函数)

9 If a conversion specification is invalid, the behavior is undefined.275) If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

转换说明符 d 需要一个 int 类型的参数,而根据函数 [=19] 的声明,表达式 strlen( str + 2 ) 具有 size_t 类型=]

size_t strlen(const char *s);

你必须写

printf("%zu\n", strlen(str + 2));
        ^^^

您声明了一个指向字符串文字的指针

const char *str = "mms";

字符串文字在内部表示为字符数组,如

{ 'm', 'm', 's', '[=14=]' }

也就是说它有 4 个字符,包括终止零字符 '[=20=]'

指针str指向文字的第一个字符。由于指针运算,表达式 str + 2 指向文字的第三个字符,即指向字符 's' 的第三个字符。

来自C标准(7.23.6.3 strlen函数)

3 The strlen function returns the number of characters that precede the terminating null character.

因此,由于表达式 str + 2 实际上指向字符串 "s",因此函数将 return 1 输出。