动态字符串输入并用C对它们进行排序

时间:2017-04-17 01:01:51

标签: c arrays string input dynamic

我想用C语言动态输入字符串。

输入:由字母组成的单词。

0&lt; n的单词n < 1000

单词的最大长度<= 30

输入示例)gh a b f cde

此外,我会按字母顺序对它们进行排序。 我可以使用数组吗?

我尝试使用gets但输入了错误...

1 个答案:

答案 0 :(得分:0)

您可以保证单词的最大长度为30,这意味着char word[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个单词。无论你选择哪个,跟踪单词数组的长度都很重要。你不太可能使用你分配的每一部分内存(通常是array_length < array_capacity。)我会把这个留给你。

最后,您可以使用qsortstrcmp周围的包装容易地对单词进行排序:

// 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);