Сортировать массив символов в C - PullRequest
2 голосов
/ 14 октября 2010

Я изо всех сил пытался написать простой код для сортировки массива char в C и потерпел неудачу.Вот что у меня есть:

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 ]

3 голосов
/ 14 октября 2010

Изменение:

length = i;

на:

length = i - 1;

и это работает.

Когда вы делаете line[i-1] = line[i];, вы удаляете \n (которыйпомещается туда на fgets) от строки и эффективно уменьшает длину строки на 1. Вы должны принять это во внимание.

В вашем текущем коде длина включает нулевой терминатор, который сортируется вначало строки, следовательно, ваш результат - пустая строка.

2 голосов
/ 14 октября 2010

Как я и подозревал, избегая CR / LF:

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

, вы включили символ '\0' в строку для сортировки.Во-первых, он получит пустую строку для печати. ​​

1 голос
/ 14 октября 2010

Вы удаляете \n из строки, перезаписывая его \0, но ваш length расчет сделан до этого изменения.

Чтобы это исправить, выполните

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

, прежде чем вычислять длину.

Поскольку ваша length на единицу больше, чем фактическая длина, \0 также участвует в сортировке символа и, посколькуНаименьший из всех символов, он помещается в начало строки, фактически делая вашу строку пустой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...