代码之家  ›  专栏  ›  技术社区  ›  Ayush

在C中对字符数组排序

  •  2
  • Ayush  · 技术社区  · 15 年前

    我一直在努力编写一个简单的代码来对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 回复  |  直到 15 年前
        1
  •  3
  •   casablanca    15 年前

    变化:

    length = i;
    

    到:

    length = i - 1;
    

    它起作用了。

    当你这样做的时候 line[i-1] = line[i]; 您正在删除 \n (放在那里的 fgets )并有效地将字符串长度缩短1。你应该考虑到这一点。

    对于当前代码,长度包括空终止符,它将被排序到字符串的开头,因此您的结果是一个空字符串。

        2
  •  2
  •   ruslik    15 年前

    正如我所怀疑的,通过避免CR/LF:

    length=i;
    line[i-1]=line[i];
    

    你包括了 '\0' 字符在要排序的字符串中。它将在第一位,所以您将有一个空字符串打印。

        3
  •  1
  •   codaddict    15 年前

    您正在删除 \n 从行中重写 \0 但是你 length 计算完成 之前 这种变化。

    要解决这个问题,请

    line[i-1]=line[i];
    

    在你计算长度之前。

    自从你 长度 比实际长度多一个, 0 还将参与作为要排序的字符,因为它是所有字符中最小的一个,所以它被放置在字符串的开头,有效地使字符串为空。