指针方式实现隔位字符复制函数的numChars限制失效问题
问题分析与修复方案
原函数的核心问题出在循环条件和逻辑判断上,导致无法正确限制复制的字符数量:
原代码的关键错误
- 循环条件
destination < numChars + destination完全无效,因为numChars为正整数时,这个不等式永远成立,根本起不到限制复制数量的作用。 - 循环开头判断
*destination != '\0'毫无意义,目标数组初始化后可能不是以'\0'开头,而且我们是主动往里面写内容,不需要判断这个。 - 当
source到末尾时的处理逻辑错误,else块里先destination++再赋值'\0',会导致目标指针偏移错误,还可能越界。
修复后的代码
void copyWord(char * destination, const char * source, int numChars) { // 保存目标起始地址,用于计算已复制的字符数 char *dest_start = destination; // 循环条件:未达到指定复制数量,且source未到末尾 while ((destination - dest_start) < numChars && *source != '\0') { *destination = *source; destination++; source += 2; } // 最后添加字符串终止符,确保目标是合法的C字符串 *destination = '\0'; }
修复说明
- 用
dest_start记录目标数组的起始位置,通过destination - dest_start计算已经复制的字符数,确保不超过numChars的限制。 - 循环同时判断两个条件:复制数量未达标,且
source还有字符可以读取,任意一个不满足就终止循环。 - 循环结束后直接在当前目标指针位置写入'\0',保证目标字符串的合法性,不管是复制满了
numChars个字符,还是source提前耗尽。
测试验证
- 当
source为"Hello",numChars设为2时,复制得到"Hl",符合需求。 - 当
source为"Hello There",numChars设为3时,会复制"Hlo",不会超出限制。
内容的提问来源于stack exchange,提问作者Dylan0127
相关产品推荐
相关产品推荐

