会打印什么?

问题描述

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

const char *str = "mms";

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

return 0;

如果我加 1,结果是 2。

解决方法

好吧,strlen 从您传递的指针开始计数,直到找到 NULL 或 \0 字符。

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

,

以下说明

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

将打印 3,因为它是字符串 "mms" 的长度。

我们记住str指向的字符串的存储方式如下

------------------
| m | m | s | \0 |
------------------

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

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


如果您的目的是将 2 添加到 str 的长度,则必须注意括号的使用:

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

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

,

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

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

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

9 如果转换规范无效,则行为是 undefined.275) 如果任何参数不是正确的类型 对应的转换规范,行为未定义。

根据函数 d 的声明,转换说明符 int 需要类型为 strlen( str + 2 ) 的参数,而表达式 size_t 的类型为 strlen

size_t strlen(const char *s);

你必须写

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

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

const char *str = "mms";

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

{ 'm','m','s','\0' }

也就是说它有 4 个字符,包括终止的零字符 '\0'

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

来自 C 标准(7.23.6.3 strlen 函数)

3 strlen 函数返回前面的字符数 终止空字符。

因此,当表达式 str + 2 实际上指向字符串 "s" 时,该函数将返回将被输出的 1

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...