我想用C语言动态输入字符串。
输入:由字母组成的单词。
0&lt; n的单词n < 1000
单词的最大长度<= 30
输入示例)gh a b f cde
此外,我会按字母顺序对它们进行排序。 我可以使用数组吗?
我尝试使用gets
但输入了错误...
答案 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
。)我会把这个留给你。
最后,您可以使用qsort
和strcmp
周围的包装容易地对单词进行排序:
// 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);