为什么我的角色数不正确?

时间:2018-02-20 18:31:10

标签: c linux text space word-count

以下代码获取字数:

int count = 0;
for (int i = 0; chars[i] != EOF; i++)
{
    if (chars[i] == ' ')
    {
         count++;
    }
}

我的问题是,它没有正确计算单词。

例如,如果我的file.txt中包含以下文字:

spaced-out there's I'd like

它说6 words,根据 MS Word ,我有4

spaced-out and in

给我一​​个4的字数。

spaced out and in

给我一​​个字数6

如果此问题之前得到解答,我很抱歉,Google没有考虑搜索中的特殊字符,因此很难找到编码的答案。我最好只是通过识别它是否是一个空格来说明。

我尝试寻找答案,但似乎没有人确切地遇到同样的问题。我知道.txt文件可能以Windows中的/r/n结尾,但那应该是一个单词的一部分。例如:

spaced out and in/r/n

我相信它仍然应该给我4个字。当我将|| chars[i] == '\n'添加为:

for (int i = 0; chars[i] != EOF || chars[i] == '\n'; i++)

我为行

获得了更多的单词,8
spaced out and in

我在基于Linux的服务器上执行此操作,但在Windows上的SSH客户端上执行此操作。字符来自.txt文件。

编辑:好的,这是代码,发布时我避免使用#include

#define BUF_SIZE 500            
#define OUTPUT_MODE 0700        

int main(int argc, char *argv[])
{
    int input, output;
    int readSize = 1, writeSize;            
    char chars[BUF_SIZE];   
    int count = 0;

    input = open(argv[1], O_RDONLY);                

    output = creat(argv[2], OUTPUT_MODE);   

    while (readSize > 0)                
    {
        readSize = read(input, chars, BUF_SIZE); 
        if (readSize < 0)       
        exit(4);

        for (int i = 0; chars[i] != '\0'; i++)
        {
            if (chars[i] == ' ')
            {
                count++;
            }
        }

        writeSize = write(output, chars, readSize);     
        if (writeSize <= 0)             
        {
            close(input);       
            close(output);
            printf("%d words\n", count);
            exit(5);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

我写这个答案是因为我想,我知道你的困惑是什么。但请注意,您没有解释如何阅读文件,我将举例说明为什么我们测试!= EOF,这不是您从文件中读取的字符。

您认为EOF是存储在文件中的字符,但事实并非如此。如果您只想计算单词,可以执行类似

的操作
int chr;
while ((chr = fgetc(file)) != EOF)
    count += (chr == ' ') ? 1 : 0;

请注意,chr必须属于int类型,因为EOF的类型为int,但它肯定不存在于文件中!它由fgetc()之类的函数返回,表示没有其他内容可读,请注意必须尝试读取才能返回它。

糟糕,还要注意我的示例代码不计算最后一个单词。但那是你要弄明白的。

此外,这会将多个空格统计为“ words ”,您还应该锻炼。