动态字符串输入并在C中对其排序

动态字符串输入并在C中对其排序,c,arrays,string,input,dynamic,C,Arrays,String,Input,Dynamic,我想使用C动态输入字符串 输入:由字母组成的单词 0

我想使用C动态输入字符串

输入:由字母组成的单词

0<字数N<1000


单词的最大长度保证单词的最大长度为30,表示字符单词[31];每一个字都足够了:

#define WORDSIZE 31
#define WORDLEN_FMT "%30s" //width must be WORDSIZE-1!

/* Read a space-delimited word from `fileptr` and store it in `word`.
 *
 * Returns:
 *      0 - maybe more words to read
 *      1 - no more words to read
 *     -1 - error occurred while reading input
 */
int get_word(FILE *fileptr, char word[WORDSIZE]) {
    size_t i;

    switch (fscanf(fileptr, WORDLEN_FMT, word)) {
    // EOF or an error was encountered.
    case EOF:
        if (ferror(fileptr)) {
            return -1;
        }
        /* Fallthrough for `feof() != 0`. */
    // If nothing was stored in `word`, then we're done.
    case 0:
        return 1;
    }
    // A word was stored, so keep going!
    return 0;
}
对于读取所有单词,您可以先分配1000个单词,也可以根据需要处理动态分配并将阵列容量增加x倍;我个人会预先分配1000个单词,因为我知道永远不会超过1000个。无论您选择哪一种,跟踪单词数组的长度都很重要,因为您不太可能使用分配的每一位内存,即数组长度通常小于数组容量。这件事由你决定

最后,您可以使用qsort和strcmp的包装器轻松地对单词进行排序:


请显示您当前的尝试,以便我们提供帮助。@starlight感谢您的评论。让我感到羞耻的是,即使我在谷歌上搜索了很多,我也不知道如何准确地访问这个问题。试着把它分成几个小部分。首先查看string.h API,看看是否有任何函数可能有助于完成此任务。在我看来,动态字符串输入和排序是两个独立的问题。请尝试在此处查看有关读取长度未知的字符串作为输入的信息:是的,您可以使用数组,也可以使用动态分配。不过,对于小于1000个字(每个字最多30个字符)加上空字节,您可以使用小于32 KiB的固定分配。你永远不应该使用gets——事实就是这样。你还应该展示你的尝试——创建一个MCVE。还不完全清楚每行是否有一个单词,或者每行是否可以有多个单词。两者都可以处理;根据《未删节词典》,你可以保证最长的单词是28个字符的反犹太教单词,所以29个字符就可以了:还有28个字符的教派间单词。
// Compare the words pointed to by `a` and `b`.
int compare_words(const void *a, const void *b) {
    return strcmp(*(const char **)a, *(const char **)b);
}

...

// Sort `word_array` using the `compare_words` function.
// The array contains `word_count` words, each with size `WORDSIZE`.
qsort(word_array, word_count, WORDSIZE, compare_words);