C在2d数组中交换字符串(不带指针)

时间:2018-01-13 11:33:52

标签: c arrays

我编写了一个按字符串长度

排序字符串数组的函数
void lenSort(char sen[][NAME_LENGTH], int len)
{
    int i = 0, j = 0, k = 0;
    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]))
            {
                strncpy(tmp, sen[j], strlen(sen[j]));
                for(k = 0; k < strlen(sen[j]); k++)
                {
                    sen[j][k] = 0;
                }
                strncpy(sen[j], sen[j+1], strlen(sen[j+1]));
                strncpy(sen[j+1], tmp, strlen(tmp));
            }
        }
    }
}

我传递的数组是:{"12345", "123", "123456", "12", "1234", "1234", "1234567", "123", "1", "12345"} 出于某种原因,当我将sen[j+1]复制到sen[j]时,我会得到多余的字符,我认为那是因为sen[j]更长,但我在复制之前将其重置并且仍然会发生我不知道为什么......

1 个答案:

答案 0 :(得分:0)

如果你想根据它们的长度对字符串进行排序,那么虽然它可以用于其他目的,但不需要内部的for循环

for(k = 0; k < strlen(sen[j]); k++)
                {
                    sen[j][k] = 0;
                }

这是我的解决方案。使用strcpy()而不是strncpy(),因为使用strncpy()复制的字符串不会以空值终止。来自strncpy man 页面 警告:如果前n个字节中没有空字节        对于src,放在dest中的字符串不会以空值终止。

void lenSort(char sen[][NAME_LENGTH], int len)
{
    int i = 0, j = 0, k = 0;
    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(tmp, sen[j]);
                strcpy(sen[j], sen[j+1]);
                strcpy(sen[j+1], tmp);
            }
        }
    }
}