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

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

继续打印文件中最长的10个字(每行一个字)。单词可以按任何顺序打印,如果有多个单词并列第十,我们可以决定怎么做。下面打印的是top 1,请欣赏任何关于构建循环的建议,该循环可以迭代并打印下一个9。在此假设,文件中最长的单词可以是200个字母和60个空格。我希望排除这两种假设,使其更具动态性。虽然下面是C,喜欢在C++中听到任何写,但是需要避免使用STL。p>
#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}wstatswstats 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;
}