C程序需要帮助将我的代码修复为单词排序程序



嗨,我仍然是C的新手,并且已经从事此Word Sort程序已有一段时间了。指南是:

编写一个程序,该程序分为用户输入的一系列单词。假设每个单词的长度不超过20个字符。当用户输入一个空词时,请停止阅读。使用指针数组将每个单词存储在动态分配的字符串中(使用read_line函数)。读完所有行毕竟,将数组排序。然后使用循环按顺序打印单词。

我似乎遇到的问题是该程序会接受单词,但是当我输入空单词时,它会进入新行,什么也不会发生。帮助或建议将不胜感激。这是我到目前为止的代码。

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

#define LEN 20
#define LIM 20
int read_line(char str[], int n);
void sort_str(char *list[], int n);
int alpha_first(char *list[], int min_sub, int max_sub);

int main(void)
{
    char *list[LIM];
    char *alpha[LIM];
    char word_str[LEN];
    int word, i, j,  num_count = 0;
    for(;;){
        printf("Enter a word: ");
        scanf("%s", &word);
        if(word == NULL)
            break;
        else
            read_line(word_str, LEN);
            list[i] = malloc(strlen(word_str) + 1);
            strcpy(list[i], word_str);
            alpha[i] = list[i];     
    }

    sort_str(alpha, i);
        for(i = 0; i < num_count; ++i){
        printf("Sorted: ");
        puts(list[i]);
    }   
    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] = '';
    return i;
}
void sort_str(char *list[], int n)
{
    int   i, index_of_min; 
    char *temp;
    for  (i= 0;  i < n - 1;  ++i) {
        index_of_min = alpha_first(list, i, n - 1);
        if (index_of_min != i) {
            temp = list[index_of_min];
            list[index_of_min] = list[i];
            list[i] = temp;
        }
    }
}

int alpha_first(char *list[], int min_sub, int max_sub){
    int i, first;
    first = min_sub;
    for(i = min_sub + 1; i <= max_sub; ++i){
        if(strcmp(list[i], list[first]) < 0){
           first = i;
        }
   }
return (first);
}

您的逻辑流有缺陷。如果输入一个单词,则Scanf()将从stdin食用它,并在整数"单词"的地址存储一个无效的字符串。输入的任何超过3/7个字符(32/64位,允许用于零终端的人),将开始损坏堆栈。然后,Read_line()将仅具有从stdin读取的行终结器(假设UB不会先吹出它)。

我似乎遇到的问题是该程序会接受单词,但是当我输入空白时,它将进入新行,什么也不会发生。

有几个问题:

char word_str[LEN];
int word, i, j,  num_count = 0;
/* ... */
    scanf("%s", &word);
    if(word == NULL)
        break;

首先, scanf("%s", &word)扫描空格划定的字符串,为此,它跳过了带有newlines在内的领先空间。您不能以这种方式读取"空词",尽管如果到达任何非Whitespace字符之前,您完全无法阅读单词(或者发生I/O错误)。

第二,您将不适当的指针传递给scanf()。您应该将指针传递给字符数组,而是将指针传递给int。看起来也许您想扫描到word_str而不是word中。

第三,您的scanf()格式不能防止缓冲区溢出。您应该提供一个场宽度,以限制可以扫描多少个字符。此外,您需要确保为字符串终止器留出空间。

第四,您不检查scanf()的返回值。如果它无法与该字段匹配任何字符,则不会存储任何字段。由于它返回成功扫描(或错误指示器)的字段数,因此您可以检测到此情况。

纠正scanf()和"空字"测试的一种方法是:

int result;
result = scanf("%*[ t]%19[^ tn]", word_str);
if (result < 1) break;

(假设固定的最大单词长度为19,将其声明的数组长度为20。)您在较大的代码中还有一些其他问题,其中 read_line()试图读取与您刚刚通过scanf()读取的相同数据(实际上,该功能看起来完全毫无意义)。另外,您永远不会更新num_count,在调用sort_str()后,您通过为变量i分配新值而失去了读取的字符串数。

也可能还有其他问题。

相关内容

最新更新