我正在尝试用 C 语言创建一个方法,可以查看指定文件中的所有字符,并计算特定字符的出现次数。
所以...
输入:Some_File.c
输出:字母“J”在您的文件中出现:“x”次。
到目前为止我所拥有的:
int main()
{
int jsCount = jsCounter();
fin(jsCount);
}
//this counts # of "j"s in a file
int jsCounter()
{
FILE *fp;
int c;
int count = 0;
char myChar = "j";
fp = fopen("Doc.c", "r");
while((c = fgetc(fp)) != EOF) {
if ( c == myChar)
count = count + 1;
}
return count;
}
//This sends info to User (How many "j"s were found)
fin(int jsCount)
{
printf("You have a total of");
printf("%d" jsCount);
}
我遇到的错误:
该方法未返回正确的数字... 警告... “初始化从指针生成整数,无需强制转换[默认启用]|”
编辑即使文档中有超过 0 个 j,我也会返回计数值 0 我来自 Java,对 C 很陌生......有什么帮助吗?
最佳答案
这是错误的
char myChar = "j";
它正在尝试分配常量字符串
"j"
的地址至myChar
,正确的做法是char myChar = 'j';
在c中,字符串文字由双引号
"some string"
分隔和单引号的字符常量,如'x'
,表达式'x'
给出字符x
的 ascii 代码.也有多字符字符常量,但它们是实现定义的,所以我无法告诉你它们的含义。
根据您使用的编译器,您可以启用编译器警告,这将防止出现此类错误,例如
gcc
你可以使用以下内容gcc -Wall -Wshadow -Wextra -Werror ${source} -o ${program}
注意:检查
fopen()
没有回来NULL
,因为如果确实如此,您不应该尝试从文件中读取。您没有包含任何所需的头文件
-
stdio.h
-
在
main()
中使用函数之前需要先声明它们。void fin(int jsCount); int jsCounter();
fin()
需要一个返回类型,如果它不返回任何内容那么void
void fin(int jsCount) { printf("You have a total of"); printf("%d", jsCount); }
最后
printf()
在fin()
缺少,
格式字符串和参数之间需要它,实际上您可以printf("You have a total of %d\n", jsCount);
额外的,在c中有一个三元运算符,它的工作原理如下
count += (c == myChar) ? 1 : 0;
它相当于
if (c == myChar) count += 1; else count += 0;
还有一个复合赋值运算符
+=
x += y;
表示
x = x + y;
这是您程序的修复版本
#include <stdio.h>
void fin(int jsCount);
int jsCounter();
int main()
{
int jsCount = jsCounter();
fin(jsCount);
}
int jsCounter()
{
FILE *fp;
int c;
int count = 0;
char myChar = 'l';
fp = fopen("Doc.c", "r");
if (fp == NULL)
{
printf("error opening the file\n");
return 0;
}
while ((c = fgetc(fp)) != EOF)
count += (c == myChar) ? 1 : 0;
return count;
}
void
fin(int jsCount)
{
printf("You have a total of %d", jsCount);
}
关于C 文件 I/O 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28597491/