字符串复制算法实现异常:源字符串前n字符丢失问题求助
问题排查与解决
异常原因分析
- 返回指针位置错误:函数
stringCopy中,*T++ = *S++执行时T指针会持续向后移动,复制完成后T已经指向目标字符串的末尾位置。此时返回该指针给printf,printf会从这个末尾位置开始输出,而非目标字符串的起始地址,导致视觉上出现“移除前n个字符”的异常。 - 缺少字符串终止符:代码中注释掉了
*T = 0;,复制后的目标字符串没有正确的'\0'终止符,printf输出时会越界读取内存,行为完全未定义。 - 不良编码习惯:
char* again = "another";里的字符串字面量是只读的,应该用const char*修饰指针,避免潜在的未定义行为。
解决步骤
- 保存目标起始地址:在函数开头保存
T的初始值,最后返回这个初始地址,确保printf能输出完整的目标字符串。 - 恢复终止符设置:取消
*T = 0;的注释,在复制完所有字符后添加字符串终止符,保证字符串格式合法。 - 修正指针类型:将
char* again改为const char* again,符合C语言对字符串字面量的使用规范。
修正后的代码
#include <stdio.h> #include <stdlib.h> char* stringCopy(char* T, const char* S){ // 保存目标字符串的起始地址 char* start = T; while(*S){ *T++ = *S++; } // 添加字符串终止符 *T = 0; // 返回起始地址 return start; } int main(void){ char sentence[100] = "some sentence"; const char* again = "another"; printf("%s", stringCopy(sentence, again)); return EXIT_SUCCESS; }
内容的提问来源于stack exchange,提问作者Dollar X
相关产品推荐
相关产品推荐

