【发布时间】:2018-09-28 03:21:42
【问题描述】:
致力于打印文件中最长的 10 个单词(每行一个单词)。单词可以按任何顺序打印,如果有多个单词并列第 10 长,我们可以决定要做什么。以下打印前 1 个,感谢任何构建循环的建议,该循环可以迭代并打印下一个 9。这里的假设是,文件中最长的单词可以是 200 个字母和 60 个空格。我希望排除这两个假设并使其更加动态地工作。虽然以下是 C 喜欢听到任何用 C++ 编写的,但需要避免使用 STL。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_WORD_LENGTH 200
int main () {
FILE *fp = fopen("words.txt","r");
char str[60];
char *largest = (char*) malloc (MAX_WORD_LENGTH);
int smallest_len = MAX_WORD_LENGTH, largest_len = 0;
while (fgets (str, 60, fp) != NULL)
{
char *temp = strtok(str, "\n");
while (temp != NULL)
{
if (strlen(temp) > largest_len)
{
strcpy(largest, temp);
largest_len = strlen(largest);
}
temp = strtok(NULL, "\n");
}
}
printf("The largest word in the file is: %s\n", largest);
fclose(fp);
return 0;
}
【问题讨论】:
-
char words[MAX_WORD_COUNT][MAX_WORD_LENGTH]是一个很好的起点,MAX_WORD_COUNT定义为 10。 -
或者更好的是
typedef struct { char word[MAX_WORD_LEN]; int len } wstats;,然后声明一个数组wstats mystats[10] = {{ .word = "" }};,您可以简单地遍历您的数组,检查mystats[i].len并在阅读文件时添加/交换单词。 -
您的文件结构如何?它只是一个每行一个单词的文件吗?
-
有一个包含 10 个单词的数组(可以是数组数组,如果不能保证最大大小,也可以是指针数组)和一个包含字符串需要的最小大小的 int允许进入数组(除非数组未满,否则它将比最短的字符串大 1)。然后,每当您遇到较长的字符串时,找到最短的字符串并将其替换为较长的字符串并更新您的 int 变量。如果您按排序顺序维护数组,将很快找到要删除的元素,尽管这可能不是插入新字符串以保持顺序的地方。
-
还要看堆数据结构。