我有一个这样格式的文本文件
Hello:Dad
How:Are
You:Today
我想计算冒号在文件中出现的次数,为此我执行了这个函数:
int NumColon(char txt[]) {
FILE *fp = fopen(txt, "r");
if (fp == NULL) {
exit(1);
}
int count = 0;
char ch;
while (!feof(fp)) {
ch = getc(fp);
if (strcmp(&ch, ":") == 0) {
count++;
}
}
return count;
}
但是当我打印变量count
的值时,它是零。然而,如果我在while
循环中执行fprint("%s", &ch);
,但在if
语句之前,我可以清楚地看到,在某些时刻,字符获得了:
,所以我不明白发生了什么,为什么它没有进入循环的if语句。
编辑:我也试过使用if (ch == ':')
,但仍然无法进入if语句。
你的代码中有多个问题:
-
ch
必须被定义为int
,以可靠地处理EOF
。 -
while (!feof(fp))
错误。了解为什么"while (!feof (file))"总是错误的?你应该这样写:while ((ch - getc(fp)) != EOF)
-
strcmp(&ch, ":")
是不正确的,因为&ch
不是C字符串。你应该用ch == ':'
代替。 -
忘记关闭文件,导致资源泄漏。
下面是修改后的版本:
int NumColon(const char *filename) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
return -1;
}
int count = 0;
int c;
while ((c = getc(fp)) != EOF) {
count += (c == ':');
}
fclose(fp);
return count;
}
strcmp
要求字符串。字符串是一个以NUL结尾的字符序列。但是&ch
是指向单个字符的指针,而不是字符串。
做char比较:if (ch == ':')