会打印什么?
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
输出。
你能解释一下为什么下面程序的输出是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
输出。