You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)执行的是多段字符串拼接输出,具体执行流程如下:

  1. 字符数组mess的实际存储内容为'a'、'b'、'c'、'd'、'\0',strlen(mess)返回不包含末尾\0的长度4,因此初始ptr指向数组末尾的\0地址。
  2. 循环执行过程:
    • 第一次循环:先执行--ptr,ptr指向字符'd'的地址,%s输出从当前ptr开始到\0的所有字符,输出内容为d
    • 第二次循环:--ptr后指向字符'c'的地址,输出从'c'到\0的字符串,输出内容为cd
    • 第三次循环:--ptr后指向字符'b'的地址,输出内容为bcd
    • 第四次循环:--ptr后指向字符'a'的地址,输出内容为abcd
  3. 四次输出拼接后结果为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:24:03