C语言无指针实现二维字符串数组排序时出现多余字符问题
问题分析与解决方案
我来帮你排查这个多余字符的问题!核心原因出在strncpy的使用逻辑上,以及你没确保字符串始终以终止符\0结尾,我们一步步拆解:
问题根源
strncpy不会自动复制终止符:当你执行strncpy(sen[j+1], tmp, strlen(tmp))时,strlen(tmp)返回的是不含\0的字符串长度(比如"12345"的长度是5),所以只会复制前5个字符,不会把tmp末尾的\0复制过去。如果sen[j+1]数组中,第5位之后的内存不是\0(比如局部数组未初始化的部分是随机值),那么字符串会一直读到下一个\0,就会出现多余字符。- 重置
sen[j]的方式冗余且没必要:你用循环清空sen[j]的前strlen(sen[j])个字符,但其实直接用字符串拷贝函数覆盖会更简单,还能自动处理终止符。
修正后的代码
简化交换逻辑,直接用strcpy完成字符串交换,它会自动复制包括\0在内的所有内容,从根源上避免终止符缺失的问题:
#include <string.h> #define NAME_LENGTH 20 // 根据你的实际需求调整长度 void lenSort(char sen[][NAME_LENGTH], int len) { int i, j; char tmp[NAME_LENGTH] = {0}; for(i = 0; i < len - 1; i++) { for(j = 0; j < len - i - 1; j++) { if(strlen(sen[j]) > strlen(sen[j+1])) { // 直接交换,strcpy会自动处理终止符,无需手动清空 strcpy(tmp, sen[j]); strcpy(sen[j], sen[j+1]); strcpy(sen[j+1], tmp); } } } }
为什么这样能解决问题?
strcpy会完整复制源字符串的所有内容,包括末尾的\0,确保目标数组中的字符串始终以\0结尾,不会出现多余字符。- 去掉了冗余的清空循环,代码更简洁,也避免了依赖
strlen计算原长度时的潜在风险。
额外安全优化(可选)
如果担心strcpy的溢出风险(比如源字符串长度接近NAME_LENGTH),可以改用手动添加终止符的方式,兼容所有C环境:
// 手动确保终止符,防止溢出 strncpy(tmp, sen[j], NAME_LENGTH - 1); tmp[NAME_LENGTH - 1] = '\0'; strncpy(sen[j], sen[j+1], NAME_LENGTH - 1); sen[j][NAME_LENGTH - 1] = '\0'; strncpy(sen[j+1], tmp, NAME_LENGTH - 1); sen[j+1][NAME_LENGTH - 1] = '\0';
内容的提问来源于stack exchange,提问作者Daniel.
相关产品推荐
相关产品推荐

