使用动态数组按字母顺序排序单词

时间:2016-11-22 18:02:51

标签: c dynamic-arrays

我在 C编程:现代方法中遇到了一个问题,如下所示。Quaternion.LookRotation()

我正在使用qsort中的stdlib.h这是我目前所拥有的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN 20

int read_line(char str[], int n);
static int cmp(const void *p1, const void *p2);
int main()
{

  char *words[MAX_LEN];
  int i = 0, j;
  char word_str[MAX_LEN + 1], s[20];

  for (;;)
    {
      printf("\nEnter a word:  ");
      fgets(s, 20, stdin);
      if (strcmp(s, "\n") == 0)
          break;
      read_line(word_str, MAX_LEN);
    }

  int len = strlen(word_str);
  words[i] = malloc(len + 1);
  strcpy(words[i], word_str);

  qsort(words, len, sizeof(char *), cmp);

  printf("\nIn sorted order:  ");
  for (j = 0; j < len; j++)
    printf("%s ", words[j]);

  printf("\n");

  return 0;

}

int read_line(char str[], int n)
{
  int ch, i = 0;

  while ((ch = getchar()) != '\n')
    if (i < n)
      str[i++] = ch;
  str[i] = '\0';
  return i;

}

static int cmp(const void *p1, const void *p2)
{

  return strcmp(* (char * const *) p1, * (char * const *) p2);

}

我收到的输出: enter image description here

我遇到困难,因为我的编译器没有给出错误,在调试时我看到word_str为空。

我是 c 的新手,所以请放轻松。

1 个答案:

答案 0 :(得分:3)

我在您的代码中看到以下问题。

问题1

保存words中文本行的代码需要位于for循环内。

for (;;)
{
  printf("\nEnter a word:  ");
  fgets(s, 20, stdin);
  if (strcmp(s, "\n") == 0)
      break;
  read_line(word_str, MAX_LEN);

  int len = strlen(word_str);
  words[i] = malloc(len + 1);
  strcpy(words[i], word_str);
}

问题2

您没有计数器来跟踪读取的行数。

使用:

int num_lines = 0;
for (;; ++num_lines)
{
  printf("\nEnter a word:  ");
  fgets(s, 20, stdin);
  if (strcmp(s, "\n") == 0)
      break;
  read_line(word_str, MAX_LEN);

  int len = strlen(word_str);
  words[num_lines] = malloc(len + 1);
  strcpy(words[num_lines], word_str);
}

问题3

您将第二个参数中的错误值传递给qsort。您需要传递num_lines,而不是最后一个字符串的长度。

qsort(words, num_lines, sizeof(char *), cmp);

问题4

打印已排序的字符串时,不要在for循环的条件下使用len。请改用num_lines

for (j = 0; j < num_lines; j++)
  printf("%s ", words[j]);