在C中对char数组进行排序

时间:2010-10-14 03:49:54

标签: c arrays string sorting

我一直在努力编写一个简单的代码来对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

这给了我意想不到的结果。我哪里错了?

3 个答案:

答案 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}}也作为要排序的字符,因为它是所有字符中最小的字符,所以它被放置在字符串,有效地使你的字符串为空。