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

时间:2018-04-18 02:38:47

标签: c++ c string file loops

继续打印文件中最长的10个单词(每行一个单词)。单词可以按任何顺序打印,如果有多个单词并列第10个最长,我们可以决定该怎么做。以下打印前1,欣赏任何建议循环可以迭代和打印下一个9的建议。假设在这里,文件中最长的单词可以是200个字母和60个空格的黑白。我想要排除这两个假设并使其更加动态地工作。虽然以下是C喜欢听到任何用C ++写的但是需要避免使用STL。

pip install git+https://github.com/ericmjl/autograd.git@cupy

2 个答案:

答案 0 :(得分: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()现有单词。

答案 1 :(得分:0)

#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;
}