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

C++字符数组与指针问题:转换s3时输出异常需重置指针

问题分析与解决

你的问题核心在于**myToUpperCase函数没有给目标字符串添加终止符'\0'**,导致内存中残留了之前操作的内容,从而输出不符合预期。

为什么会出现这种情况?

  1. 第一次调用myToUpperCase(s2, result)时,函数将"#c++"转换为"#C++"并写入result,但循环结束后没有在result的末尾添加字符串终止符'\0'。此时result的前4个字符是'#'、'C'、'+'、'+',后续内存区域保留着之前操作的残留内容。
  2. 第二次调用myToUpperCase(s3, result)时,函数只将s3中的'q'转换为'Q'并写入result[0],循环就因为遇到s3的'\0'而终止。但此时result[1]及之后的字符仍然保留着第一次操作的内容('C'、'+'、'+'),所以输出时会从'Q'开始一直读到内存中第一个'\0',最终显示为"QC++"。

修正后的代码

只需要在循环结束后,给目标字符串添加终止符即可:

#include <iostream>
#include <cstring>
#include <cctype>

void myToUpperCase(const char *source, char *dest){
    int i = 0;
    for(; *(source + i) != '\0'; i++) {
        *(dest + i) = toupper(*(source + i));
    }
    // 添加字符串终止符,确保dest是合法的C风格字符串
    *(dest + i) = '\0';
}

int main() {
    char s2[20] = "#c++";
    char s3[2] = "q";
    char result[20];
    
    myToUpperCase(s2, result);
    std::cout << "- s2 (\"" << s2 << "\") myToUpper() -> " << result << std::endl;
    
    myToUpperCase(s3, result);
    std::cout << "- s3 (\"" << s3 << "\") myToUpper() -> " << result << std::endl;
    
    return 0;
}

验证结果

修正后运行程序,第二次处理s3时,result会被正确设置为"Q"并添加终止符,输出结果符合预期:

- s2 ("#c++") myToUpper() -> #C++
- s3 ("q") myToUpper() -> Q

内容的提问来源于stack exchange,提问作者Richard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:18:01