我编写了一个按字符串长度
排序字符串数组的函数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]
更长,但我在复制之前将其重置并且仍然会发生我不知道为什么......
答案 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);
}
}
}
}