You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言无指针实现二维字符串数组排序时出现多余字符问题

问题分析与解决方案

我来帮你排查这个多余字符的问题!核心原因出在strncpy的使用逻辑上,以及你没确保字符串始终以终止符\0结尾,我们一步步拆解:

问题根源

  1. strncpy不会自动复制终止符:当你执行strncpy(sen[j+1], tmp, strlen(tmp))时,strlen(tmp)返回的是不含\0的字符串长度(比如"12345"的长度是5),所以只会复制前5个字符,不会把tmp末尾的\0复制过去。如果sen[j+1]数组中,第5位之后的内存不是\0(比如局部数组未初始化的部分是随机值),那么字符串会一直读到下一个\0,就会出现多余字符。
  2. 重置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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:09:12