为什么我的wc实现会给出错误的字数?

时间:2017-11-02 13:29:33

标签: c linux string algorithm wc

这是一个小代码段。

 while((c = fgetc(fp)) != -1)
    {
        cCount++; // character count
        if(c == '\n') lCount++; // line count
        else 
        {
            if(c == ' ' && prevC != ' ') wCount++; // word count
        }
        prevC = c; // previous character equals current character. Think of it as memory.
    }

现在,当我使用包含上述代码段的文件运行wc时(原样),我得到48个单词,但是当我在相同的输入数据上使用我的程序时,我得到59个单词。

如何计算与wc完全相同的字数?

4 个答案:

答案 0 :(得分:1)

您正在将任何不是空格的内容视为有效单词。这意味着后面跟一个空格的换行符就是一个单词,而且由于你的输入(这是你的代码片段)是缩进的,你会得到一堆额外的单词。

您应该使用isspace来检查空格,而不是将字符与' '进行比较:

while((c = fgetc(fp)) != EOF)
{
    cCount++;
    if (c == '\n')
        lCount++;
    if (isspace(c) && !isspace(prevC))
        wCount++;
    prevC = c;
}

答案 1 :(得分:1)

本书中有一个你想要的功能的例子:" Brian W Kernighan和Dennis M Ritchie:Ansi C编程语言"。正如作者所说:这是UNIX程序wc的一个简单版本。改变只计算单词是这样的:

#include <stdio.h>

#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */

/* nw counts words in input */
main()
{
  int c, nw, state;
  state = OUT;
  nw = 0;
  while ((c = getchar()) != EOF) {
    if (c == ' ' || c == '\n' || c == '\t')
       state = OUT;
    else if (state == OUT) {
       state = IN;
       ++nw;
    }
  } 
  printf("%d\n", nw);
 }

答案 2 :(得分:0)

不应仅检查空格,而应检查\ t \ n空格等转义序列。

这将给出正确的结果。 您可以使用<ctype.h>

中的isspace()

更改行

if(c == ' ' && prevC != ' ') wCount++;

if(isspace(c) && !(isspace(prevC)) wCount++;

这将给出正确的结果。 不要忘记包含<ctype.h>

答案 3 :(得分:0)

你可以这样做:

int count()
{
    unsigned int cCount = 0, wCount = 0, lCount = 0;
    int incr_word_count = 0;
    char c;
    FILE *fp = fopen ("text", "r");

    if (fp == NULL)
    {
            printf ("Failed to open file\n");
            return -1;
    }

    while((c = fgetc(fp)) != EOF)
    {
            cCount++; // character count
            if(c == '\n') lCount++; // line count
            if (c == ' ' || c == '\n' || c == '\t')
                    incr_word_count = 0;
            else if (incr_word_count == 0) {
                    incr_word_count = 1;
                     wCount++; // word count
            }
    }
    fclose (fp);
    printf ("line : %u\n", lCount);
    printf ("word : %u\n", wCount);
    printf ("char : %u\n", cCount);
    return 0;
}