为什么我的字数不正确?
Why is my character count incorrect?
获取字数的代码如下:
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在搜索时没有考虑到特殊字符,所以很难找到编码的答案。我最好通过确定它是否是 space 来获得这些词。
我尝试寻找答案,但似乎没有人遇到完全相同的问题。我知道 .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] != '[=12=]'; i++)
{
if (chars[i] == ' ')
{
count++;
}
}
writeSize = write(output, chars, readSize);
if (writeSize <= 0)
{
close(input);
close(output);
printf("%d words\n", count);
exit(5);
}
}
}
我写这个答案是因为我想,我知道你的困惑是什么。但是请注意,你没有解释你是如何读取文件的,我会举个例子来解释为什么我们测试 != EOF
,这不是你从文件中读取的字符。
您似乎认为 EOF
是一个存储在文件中的字符,但事实并非如此。如果你只是想计算单词数,你可以这样做
int chr;
while ((chr = fgetc(file)) != EOF)
count += (chr == ' ') ? 1 : 0;
请注意 chr
必须是 int
类型,因为 EOF
是 int
类型,但它肯定不存在于文件中!它由 fgetc()
等函数 return 编辑,表示没有更多内容可读,请注意,必须尝试阅读才能 return 它。
糟糕,另请注意,我的示例代码不会计算最后一个单词。但那是你要弄清楚的。
此外,这会将多个空格计为“words”,您也应该锻炼一下。
获取字数的代码如下:
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在搜索时没有考虑到特殊字符,所以很难找到编码的答案。我最好通过确定它是否是 space 来获得这些词。
我尝试寻找答案,但似乎没有人遇到完全相同的问题。我知道 .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] != '[=12=]'; i++)
{
if (chars[i] == ' ')
{
count++;
}
}
writeSize = write(output, chars, readSize);
if (writeSize <= 0)
{
close(input);
close(output);
printf("%d words\n", count);
exit(5);
}
}
}
我写这个答案是因为我想,我知道你的困惑是什么。但是请注意,你没有解释你是如何读取文件的,我会举个例子来解释为什么我们测试 != EOF
,这不是你从文件中读取的字符。
您似乎认为 EOF
是一个存储在文件中的字符,但事实并非如此。如果你只是想计算单词数,你可以这样做
int chr;
while ((chr = fgetc(file)) != EOF)
count += (chr == ' ') ? 1 : 0;
请注意 chr
必须是 int
类型,因为 EOF
是 int
类型,但它肯定不存在于文件中!它由 fgetc()
等函数 return 编辑,表示没有更多内容可读,请注意,必须尝试阅读才能 return 它。
糟糕,另请注意,我的示例代码不会计算最后一个单词。但那是你要弄清楚的。
此外,这会将多个空格计为“words”,您也应该锻炼一下。