C++ 在文件中查找10个最长的单词
继续打印文件中最长的10个字(每行一个字)。单词可以按任何顺序打印,如果有多个单词并列第十,我们可以决定怎么做。下面打印的是top 1,请欣赏任何关于构建循环的建议,该循环可以迭代并打印下一个9。在此假设,文件中最长的单词可以是200个字母和60个空格。我希望排除这两种假设,使其更具动态性。虽然下面是C,喜欢在C++中听到任何写,但是需要避免使用STL。p>C++ 在文件中查找10个最长的单词,c++,c,string,file,loops,C++,C,String,File,Loops,继续打印文件中最长的10个字(每行一个字)。单词可以按任何顺序打印,如果有多个单词并列第十,我们可以决定怎么做。下面打印的是top 1,请欣赏任何关于构建循环的建议,该循环可以迭代并打印下一个9。在此假设,文件中最长的单词可以是200个字母和60个空格。我希望排除这两种假设,使其更具动态性。虽然下面是C,喜欢在C++中听到任何写,但是需要避免使用STL。p> #include <stdio.h> #include <string.h> #include <stdli
#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;
}
#包括
#包括
#包括
#定义最大单词长度200
int main(){
文件*fp=fopen(“words.txt”,“r”);
char-str[60];
字符*最大=(字符*)malloc(最大字长度);
int最小长度=最大单词长度,最大长度=0;
while(fgets(str,60,fp)!=NULL)
{
char*temp=strtok(str,“\n”);
while(temp!=NULL)
{
如果(温度>最大值)
{
strcpy(最大,温度);
最大长度=斯特伦(最大);
}
temp=strtok(空,“\n”);
}
}
printf(“文件中最大的字是:%s\n”,最大);
fclose(fp);
返回0;
}
您没有明确说明这一点,但根据示例代码,我假设该文件每行一个字
首先,这个任务是一个相当简单的shell单行程序
awk'{print length($0),$0}'words.txt | sort-rn | head | awk'{print$2}'
这将比运行自己的程序更快、更健壮。管道打印每个以长度和空格为前缀的单词,按相反顺序对结果行进行数字排序,取前10行,然后打印不带长度的单词
假设您确实需要编写C,以下是一些建议:
- 除非你有很强的理由避免动态分配,否则要学会如何使用。它为您处理动态分配,从而避免您需要选择数组的大小
- 没有理由使用
删除换行符。换行符只会在每一个长度上添加一个,而不会更改结果,并且您仍然需要打印换行符来报告结果strtok()
- 将结果保存在数组中
char*longwords[10]代码>。每次你得到一个新词,对照
长词中的所有内容进行检查。如果生词足够长,则用新词替换
中最短的词。根据需要使用新单词和现有单词longwords
#包括
#包括
#包括
#定义最大单词长度200
int main(){
文件*fp=fopen(“words.txt”,“r”);
char-str[60];
字符*最大=(字符*)malloc(最大字长度);
int最小长度=最大单词长度,最大长度=0;
int len\u temp=MAX\u WORD\u LENGTH;//新添加的代码
对于(整数cnt=1;cnt最大长度和长度(温度)
char words[MAX\u WORD\u COUNT][MAX\u WORD\u LENGTH]
将是一个很好的开始,将MAX\u WORD\u COUNT
定义为10。或者更好的是typedef struct{char WORD[MAX\u WORD\u LEN];int LEN}wstats然后声明一个数组wstats mystats[10]={{{.word=”“}
你只需在数组上迭代,检查mystats[i].len
并在阅读文件时添加/交换单词。你的文件结构如何?它只是一个每行有一个单词的文件吗?有一个10个单词的数组(可以是数组数组数组,如果不能保证最大大小,也可以是指针数组)和一个包含字符串最小大小的int,则需要允许该字符串进入数组(除非数组未满,否则它将比最短字符串大1)。然后,每当遇到较长的字符串时,找到最短的字符串并用较长的字符串替换,然后更新int变量。如果按排序顺序维护数组,将很快找到要删除的元素,尽管这可能不是插入新字符串以保持顺序的地方。另外,请查看堆数据结构。是否介意用简单的代码在C/C++中解释您的建议?但效率要低得多,它必须对整个数组进行排序和存储,而不仅仅是最长的entires。是的,请尝试使用40 GB文件的shell one liner,我们将看到它与最简单的解决方案相比的效果,该解决方案仅将每一行与当前前10行进行比较(即使不使用最大堆)。请告诉我有关您碰巧拥有的40 GB文本文件的更多信息。英语中没有那么多单词。但是假设一下,我可以将shell的想法扩展到40GB,比实现“普通”C解决方案的速度要快。这似乎是在打印同一个单词十次。
#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: %s\n, 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;
}