1

標準入力から単語をカウントするための、ほぼ適切に動作するプログラムを取得しました。何を数える必要があるかという単語は、プログラムの引数です。

問題は、単語を表示するために空白を使用することですが、単語自体もカウントする必要があります。例: 入力が aa aaaa #EOF で、aa をカウントしたい場合、結果は 4 になるはずです。私のコードの結果は 2 です。

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


int word_cnt(const char *s, char *argv[])
{
    int cnt = 0;

    while(*s != '\0')
    {
        while(isspace(*s))
        ++s;
        if(*s != '\0')
        {
            if(strncmp(s, argv[1], strlen(argv[1])) == 0)
            ++cnt;

            while(!isspace(*s) && *s != '\0')
            ++s;
        }
     }

    return cnt;
}

int main(int argc, char *argv[])
{
    char buf[1026] = {'\0'};
    char *p="#EOF\n";
    int tellen = 0;

    if (argc != 2)
    {
        printf("Kan het programma niet uitvoeren, er is geen programma argument gevonden\n");
        exit(0);
    }

    while((strcmp(buf, p) !=0))
    {
        fgets (buf, 1025, stdin);
        tellen += word_cnt(buf, argv);
    }

    printf("%d", tellen);

    return 0;
}
4

3 に答える 3

3

あなたがこれを持っているところ:

if(strncmp(s, argv[1], strlen(argv[1])) == 0)
    ++cnt;

while(!isspace(*s) && *s != '\0')
    ++s;

これを試して:

/* if it matches, count and skip over it */
while (strncmp(s, argv[1], strlen(argv[1])) == 0) {
    ++cnt;
    s += strlen(argv[1]);
}

/* if it no longer matches, skip only one character */
++s;
于 2012-12-28T22:22:45.787 に答える
2
int word_cnt(const char *s, char *argv[])
{
    int cnt = 0;
    int len = strlen(argv[1]);
    while(*s)
    {
            if(strncmp(s, argv[1], len) == 0)
              ++cnt;

            ++s;
     }

    return cnt;
}
于 2012-12-28T22:49:46.613 に答える
1

ループでstrncmp()を試してください。

/* UNTESTED */
unsigned wc(const char *input, const char *word) {
    unsigned count = 0;
    while (*input) {
        if (strncmp(input, word, strlen(word)) == 0) count++;
        input++;
    }
    return count;
}
于 2012-12-28T22:57:54.277 に答える