提问人:quench 提问时间:10/6/2023 最后编辑:Vlad from Moscowquench 更新时间:10/6/2023 访问量:71
我正在尝试从 .txt 文件中读取文本并使用 c 计算其中的字数
I'm trying to read text from a .txt file and count the amount of words in it using c
问:
这就是我目前所拥有的。问题在于,“count”变量在命中换行符或空格字符时没有正确地添加到自身中。
#include <stdio.h>
#include <stdlib.h>
int main(void){
char c;
int count = 0;
int* ptr;
int size;
FILE *file = fopen("file.txt", "r"); //Reads from input file
//Test to see if the file exists
if (file == NULL){
printf("ERROR 1: TARGET INPUT FILE DOES NOT EXIST, HAS BEEN RENAMED OR HAS BEEN MOVED.");
exit(1);
}
c = fgetc(file);
while ((c = fgetc(file)) != EOF){
if(c == " " || c == "\n"){
count++;
}
}
fclose(file);
printf("Number of words present in given file: %d", count);
return 0;
}
我不太清楚为什么它会失败,尽管我已经查找了多个来源,这些来源几乎具有似乎对他们有用的确切代码。输出应返回一个数字,表示 .txt 文件中的字数。
答:
2赞
Vlad from Moscow
10/6/2023
#1
对于初学者来说,变量应该声明为具有类型而不是 .c
int
char
还有 while 循环之前的调用fgetc
c = fgetc(file);
被忽略
您正在将整数与指针进行比较
if(c == " " || c == "\n"){
因为上述表达式中的字符串文字被转换为指向其第一个字符的指针。编译器应为此 if 语句发出一条消息。
但是如果你愿意写
if(c == ' ' || c == '\n'){
然而,使用字符常量的方法不正确,因为它没有考虑相邻的空间。
评论
1赞
Jabberwocky
10/6/2023
您还应该提到这应该是并且可能指向众多骗子之一。char c;
int c;
-2赞
San Zhang
10/6/2023
#2
试试这个
while ((c = fgetc(file)) != EOF){
if((c>='A'&& c<='Z') || (c>='a'&& c<='z')){
while ((c = fgetc(file)) != EOF){
if(c == '\n' || c == ' '){
count++;
break;
}
}
}
}
在初始代码中,如果我的文件中有“fsdfs \n asfsf”,则计数可能大于 它应该是。
评论
1赞
Jabberwocky
10/6/2023
这是一个糟糕的答案,因为:1:没有解释。2:没有提到为什么是错的。3:代码过于复杂。char c;
0赞
Surge
10/6/2023
@Jabberwocky,用代替有什么问题?我听说过,但我不明白转换的问题。我知道从返回一个 casted from .这是可能的转换吗 -- 如果这是实际情况的话?如果您保证使用 ASCII,那将不是问题。char c
int c
fgets
int
unsigned char
signed char
char
1赞
Jabberwocky
10/6/2023
@Surge读过 stackoverflow.com/questions/32720934/......、stackoverflow.com/questions/48870708/......和 stackoverflow.com/questions/1782080/......可能还有其他一些
1赞
Jon Green
10/6/2023
#3
fgetc()
返回 一个 ,而不是 .所以应该声明.int
char
c
int
- 您阅读了文件的第一个字符...并丢弃它。你是故意的吗?我可以看到这样做的充分理由,我只是不确定你是否也有同样的想法。
- 在 中,您将单个字符与字符串进行比较,因为您使用了双引号和 。你不能在 C 中做到这一点——或者,至少,结果会相当随机。请改用单引号,因此 .这样,您就可以与单个字符值进行比较。
if(c == " " || c == "\n")
" "
"\n"
if(c == ' ' || c == '\n')
- 您声明了它们,但没有使用它们。不妨删除这些行。一个像样的编译器会警告你未使用的变量。
int* ptr;
int size;
- 无论如何,你的方法都是不正确的。如果您的文件包含大量空行,或者单词之间有多个空格,则字数统计将不正确。您应该计算非空格紧跟空格(或 EOF)的次数,并忽略重复的空格。我会把它留给学生作为练习!
下一个:else 语句逻辑是古怪的
评论
c
int
c
" "
"\n"
if(c == " " || c == "\n")