在文件中查找 10 个最长的单词

Find 10 longest words in a file

本文关键字:单词 文件 查找      更新时间:2023-10-16

打印文件中最长的 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: %sn", largest);
fclose(fp);
return 0;
}

您没有明确说明,但根据您的示例代码,我将假设该文件是每行一个单词。

首先,这个任务是一个相当简单的单行外壳。

awk '{print length($0), $0}' words.txt | sort -rn | head | awk '{print $2}'

这将比滚动自己的程序更快,更健壮。管道打印每个单词,以长度和空格为前缀,以相反的顺序对生成的行进行数字排序,取前 10 个,然后打印没有长度的单词。

假设你确实需要编写 C,这里有一些建议:

  • 除非您有非常充分的理由避免动态分配,否则请了解如何使用getline()。它为您处理动态分配,这使您无需选择数组的大小。

  • 没有理由使用strtok()来删除换行符。换行符只会为每个长度添加一个,而不会改变结果,无论如何您都需要打印换行符来报告结果。

  • 将结果保存在数组char *longwords[10];中。每次您收到一个新单词时,请检查longwords中的所有内容。如果新单词足够长,请将longwords中最短的单词替换为新单词。strdup()新单词,并根据需要free()现有单词。

#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;
int len_temp = MAX_WORD_LENGTH;  // new added code

for (int cnt = 1; cnt <= 10; cnt ++) // new added code
{
while (fgets (str, 60, fp) != NULL)
{
char *temp = strtok(str, "n");
while (temp != NULL)
{
if (strlen(temp) > largest_len && strlen(temp) < len_temp)
{ // here len_temp is for remember the last biggest one length
strcpy(largest, temp);
largest_len = strlen(largest);
}
temp = strtok(NULL, "n");
}
}
// new added code
printf("The %dst word in the file is: %sn, length is %d", cnt, largest, largest_len);
len_temp = largest_len;  // remember last largest length
rewind(fp); // new added code
largest_len = 0; // new added code
}
fclose(fp);
return 0;
}