这是一个小代码段。
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完全相同的字数?
答案 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>
更改行
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;
}