我一直在努力编写一个简单的代码来对C中的char数组进行排序,并且失败了。这就是我到目前为止所做的:
int main()
{
char line[128];
char word[128];
int i=0;
int j;
int length;
while(fgets(line,sizeof line,stdin) != NULL)
{
length=0;
i=0;
while (line[i]!='\0')
i++;
length=i;
line[i-1]=line[i];
for (i=0;i<=length;i++)
word[i]=line[i];
for (i=length-1; i>=0; i--)
{
for (j=0;j<i;j++)
{
if (line[j] > line[i])
{
char temp;
temp=line[j];
line[j]=line[i];
line[i]=temp;
}
}
}
printf("%s %s\n",line,word);
}
return 0;
}
原始档案:
overflow
array
test
string
stack
输出文件:
overflow
array
test
string
stack
这给了我意想不到的结果。我哪里错了?
答案 0 :(得分:3)
变化:
length = i;
为:
length = i - 1;
它有效。
执行line[i-1] = line[i];
时,您要从行中删除\n
(由fgets
放置),并有效地将字符串长度减少1.您应该考虑到这一点
使用当前代码,长度包括空终止符,它将被排序到字符串的开头,因此结果为空字符串。
答案 1 :(得分:2)
就像我怀疑的那样,通过避开CR / LF:
length=i;
line[i-1]=line[i];
您在要排序的字符串中包含'\0'
字符。它将首先出现,因此您将打印一个空字符串。
答案 2 :(得分:1)
您要删除行中的\n
,并使用\0
覆盖length
,但此更改之前已完成line[i-1]=line[i];
计算。
要解决此问题,请执行
length
在计算长度之前。
由于\0
比实际长度多一个,{{1}}也作为要排序的字符,因为它是所有字符中最小的字符,所以它被放置在字符串,有效地使你的字符串为空。