指针版strcat函数实现异常:目标数组拼接后无变化问题排查
问题分析与修正
你的strpcat函数存在指针与索引混用导致的位置计算错误,这是拼接未生效的核心原因:
错误点拆解
- 第一个
while循环中,你同时对指针s执行自增操作,又累加索引i。循环结束时,s已经指向目标字符串末尾'\0'的下一个内存位置,而i的值等于原字符串的长度。此时你用*(s+i)赋值,相当于直接写到了目标数组a的远超出预期的位置(甚至可能越界),完全没有覆盖原字符串的'\0'位置,自然无法实现拼接效果。 - 额外的
i变量属于冗余设计,同时操作指针和索引很容易导致逻辑混乱。
修正方案
方案1:纯指针实现(更符合指针操作的思路)
#include <stdio.h> void strpcat(char *s, char *t) { // 移动指针到目标字符串的末尾('\0'所在位置) while (*s != '\0') { s++; } // 从末尾开始复制t的内容,直到t的'\0'被复制完成 while ((*s = *t) != '\0') { s++; t++; } } int main(void) { char a[20] = "Hello"; char b[] = "Bye"; strpcat(a, b); printf("%s\n", a); return 0; }
方案2:纯索引实现(避免指针偏移的混淆)
如果习惯用数组索引,也可以完全放弃指针移动,只用索引定位:
#include <stdio.h> void strpcat(char *s, char *t) { int i = 0; // 找到目标字符串的末尾索引 while (s[i] != '\0') { i++; } // 从末尾索引开始拼接t的内容 while ((s[i] = *t++) != '\0') { i++; } } int main(void) { char a[20] = "Hello"; char b[] = "Bye"; strpcat(a, b); printf("%s\n", a); return 0; }
两种方案都能正确将b拼接到a的末尾,运行后会输出HelloBye。
内容的提问来源于stack exchange,提问作者Dash point
相关产品推荐
相关产品推荐

