【问题标题】:Why is my character count incorrect?为什么我的字符数不正确?
【发布时间】:2018-07-31 05:07:03
【问题描述】:

以下代码获取字数:

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

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

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

隔开有我想要的

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

间隔开和进

给我4的字数。

间隔开和进

给我6的字数

对不起,如果这个问题之前已经回答过,谷歌没有考虑搜索中的特殊字符,所以很难找到编码的答案。我最好只通过识别它是否是空格来获得单词。

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

间隔开和进/r/n

我相信它仍然应该给我4的话。另外,当我将|| chars[i] == '\n' 添加为:

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

我得到了更多的词,8 代表这条线

间隔开和进

我在基于 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);
        }
    }
}

【问题讨论】:

  • 我在任何时候都怀疑chars[i] == EOF。请发布您如何填充chars
  • EOF 不是字符串中的有效字符,实际上您不会在字符串中找到它。 EOF 是类似 fgetc 的函数返回以指示文件结束的值。
  • " 单词数不正确。" --> 发布charsminimal reproducible example 的定义
  • @Lukali 与其描述代码,不如在问题中更好更清晰地发布它。示例输入也很有用。
  • @chux 我现在已经包含了代码,谢谢你的帮助。

标签: c linux text space word-count


【解决方案1】:

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

您似乎认为EOF 是一个存储在文件中的字符,其实不是。如果你只想数单词,你可以这样做

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

注意chr 必须是int 类型,因为EOFint 类型,但它肯定不会出现在文件中!它由 fgetc() 之类的函数返回,表示没有更多内容要读取,请注意,必须尝试读取才能返回它。

糟糕,还要注意我的示例代码不会计算最后一个单词。但这是你自己想办法。

此外,这会将多个空格计为“单词”,您也应该锻炼一下。

【讨论】:

  • 如果我有 char[i] != '\0' 怎么办?只是我已经获得了这些字符的数组,所以我想使用该数组而不是读取文件来获取字符。我刚刚检查过,当我使用“\0”时,我得到了相同的字符数。
  • @Lukali 如果您不显示您的代码,则无法进一步帮助您。
  • 如果你有时间看一下,我现在已经包含了,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2012-09-13
  • 2023-03-25
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多