我在 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);
}
我遇到困难,因为我的编译器没有给出错误,在调试时我看到word_str
为空。
我是 c 的新手,所以请放轻松。
答案 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]);