C++字符数组与指针问题:转换s3时输出异常需重置指针
问题分析与解决
你的问题核心在于**myToUpperCase函数没有给目标字符串添加终止符'\0'**,导致内存中残留了之前操作的内容,从而输出不符合预期。
为什么会出现这种情况?
- 第一次调用
myToUpperCase(s2, result)时,函数将"#c++"转换为"#C++"并写入result,但循环结束后没有在result的末尾添加字符串终止符'\0'。此时result的前4个字符是'#'、'C'、'+'、'+',后续内存区域保留着之前操作的残留内容。 - 第二次调用
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
相关产品推荐
相关产品推荐

