如何解决会打印什么?
你能解释一下为什么下面程序的输出是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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。