在文件中查找 10 个最长的单词
Find 10 longest words in a file
打印文件中最长的 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;
}
相关文章:
- 文本文件中的单词链表
- 在指针的帮助下,文本文件中单词的频率
- 我们如何在文本文件中找到C++中的几个单词?
- 是否可以在文本文件中找到最长单词的长度,并在同一个文本文件中读取,只需 1 个 while 循环?
- 按单词搜索文件,然后在C++中打印特定行数
- 如何检查流中文件的下一个单词是否为 alpha?
- 从文件中查找单词并替换到其他文件中
- 该程序将.csv文件中的一系列单词放入数组中,然后随机生成句子.但它不起作用
- 如何逐行从文件中获取单词,并在C++中用分号分隔?
- 如何从文件中读取单词,将它们分配给数组并分析其内容?
- 如何在 c++ 中从文本文件中获取特定单词?
- 我们如何重新制作程序以打开xml文件并在价格单词之后读取百分比值并更改此值
- 从之前添加的批处理文件中删除单词
- C++读取大文件并将其保存到字符串中,然后删除特定的随机单词
- C++ 如何检查哪些单词不在 2 个类似文件中
- 显示文件中具有最小给定元音数的单词
- 简单的二分搜索对我不起作用。我正在尝试从文本文件中搜索单词
- 使用结构数组计算文本文件中单词的出现次数C++
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 将玩家输入与单词文件进行比较