C语言char数组打印未输出单个字符而是部分子串问题咨询
C语言代码输出结果分析
问题代码
#include <iostream> #include <string.h> int main() { char mess[] = "abcd"; char* ptr; ptr = mess + strlen(mess); while (ptr > mess) printf("%s", --ptr); return 0; }
输出不符合预期的原因
你预期输出单个字符倒序拼接的dcba,但实际代码使用printf("%s", --ptr)执行的是多段字符串拼接输出,具体执行流程如下:
- 字符数组
mess的实际存储内容为'a'、'b'、'c'、'd'、'\0',strlen(mess)返回不包含末尾\0的长度4,因此初始ptr指向数组末尾的\0地址。 - 循环执行过程:
- 第一次循环:先执行
--ptr,ptr指向字符'd'的地址,%s输出从当前ptr开始到\0的所有字符,输出内容为d - 第二次循环:
--ptr后指向字符'c'的地址,输出从'c'到\0的字符串,输出内容为cd - 第三次循环:
--ptr后指向字符'b'的地址,输出内容为bcd - 第四次循环:
--ptr后指向字符'a'的地址,输出内容为abcd
- 第一次循环:先执行
- 四次输出拼接后结果为
d+cd+bcd+abcd=dcdbcdabcd,和实际运行结果一致。
如果要得到你预期的dcba结果,只需要将printf("%s", --ptr)改为printf("%c", *--ptr)即可,用%c格式符单次输出单个字符。
涉及的C语言核心知识点
- 字符串存储规则:C语言中的字符串默认以
\0作为结束标志,strlen计算的是从字符串起始地址到\0之前的字符总数,不包含\0本身。 - 指针运算规则:字符类型指针的加减偏移单位为1字节,对应单个字符的存储长度,
ptr + n等价于指向ptr向后第n个字符的地址。 - printf格式符差异:
%s要求传入字符指针,会持续输出指针指向的内存内容直到遇到\0为止;%c要求传入单个字符值,仅输出一个字符。 - 前置自减运算符特性:
--ptr会先对指针执行减1偏移操作,再返回偏移后的指针值。
内容的提问来源于stack exchange,提问作者Thinh Doan
相关产品推荐
相关产品推荐

