簡體   English   中英

C程序對輸入文件中的單詞總數進行計數

[英]C program to count total words in an input file

輸入文件在第2行包含一個完全為空的行,並在文本的最后一個句號之后包含一個不必要的空格。 通過這個輸入文件,我得到了48個單詞,而我想得到了46個單詞。

我的輸入文件包含:
“從查爾斯·達爾文的兩個城市的故事開始

那是最美好的時光,那是最糟糕的時光。 那是智慧的時代,那是愚昧的時代。 這是信仰的時代,是懷疑的時代。

這是我嘗試的方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define max_story_words 1000
#define max_word_length 80

int main (int argc, char **argv)
{


    char story[max_story_words][max_word_length] = {{0}};
    char line[max_story_words] = {0};
    char *p;
    char ch = 0;
    char *punct="\n ,!.:;?-";
    int num_words = 1;
    int i = 0;

    FILE *file_story = fopen ("TwoCitiesStory.txt", "r");
    if (file_story==NULL) {
        printf("Unable to open story file '%s'\n","TwoCitiesStory.txt");
        return (EXIT_FAILURE);
    }

    /* count words */
    while ((ch = fgetc (file_story)) != EOF) {
        if (ch == ' ' || ch == '\n')
            num_words++;
    }

    rewind (file_story);

    i = 0;
    /* read each line in file */
    while (fgets (line, max_word_length, file_story) != NULL)
    {
        /* tokenize line into words removing punctuation chars in punct */
        for (p = strtok (line, punct); p != NULL; p = strtok (NULL, punct))
        {
            /* convert each char in p to lower-case with tolower */
            char *c = p;
            for (; *c; c++)
                *c = tolower (*c);

            /* copy token (word) to story[i] */
            strncpy ((char *)story[i], p, strlen (p));
            i++;
        }
    }

    /* output array */
    for(i = 0; i < num_words; i++)
        printf ("story[%d]: %s\n", i, story[i]);

    printf("\ntotal words: %d\n\n",num_words);

    return (EXIT_SUCCESS);
}

您的num_words考慮了兩個額外的空格,這就是為什么得到48個空格的原因。

如果我沒記錯的話,您應該在fgets - strtok循環之后立即打印i

遵循以下原則:

while ((ch = fgetc (file_story)) != EOF) {
    if (ch == ' ') {
         num_words++;
         while( (ch = fgetc (file_story)) == ' ' && (ch != EOF) )
    }
    if (ch == '\n') {
         num_words++;
         while( (ch = fgetc (file_story)) == '\n' && (ch != EOF) )
    }

雖然我不知道為什么您只使用空格和換行符來計算新單詞。 您的代碼中絕對不會包含由其他標點符號分隔的兩個單詞

我的建議是更改單詞計數循環,如下所示:

/* count words */
num_words = 0;
int flag = 0; // set 1 when word starts and 0 when word ends
while ((ch = fgetc (file_story)) != EOF) {
    if ( isalpha(ch) )
    {
        if( 0 == flag )   // if it is a first letter of word ...
        {
            num_words++;  // ... add to word count
            flag = 1;   // and set flag to skip not first letters
        }
        continue;
    }
    if ( isspace(ch) || ispunct(ch) )  // if word separator ...
    {
        flag = 0;                      // ... reset flag
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM