该函数被调用,
printf("%d occurrences of %c in %s\n",
countoccurrences(argv[1], argv[1][0]),
argv[1][0], argv[1]);
到目前为止这是我的功能:
/* countcharinfile
* input: char *filename, char c
* output: the number of occurrences of char c inside file filename
*/
int countoccurrences(char *filename, char c)
{
// count the number of occurrences of c in the file named filename
FILE *fp = fopen(filename,"r");
int ch,count=0;
while ((ch = fgetc(fp) != EOF))
{
if (ch == c)
count++;
}
return count;
}
当我运行该程序时,./main Today is a beutiful day
我收到错误Segmentation fault (core dumped)
答案 0 :(得分:3)
看起来您在countoccurrences
中使用了main
函数,然后才定义它。
在main
之前添加功能签名:
int countoccurrences(char *, char);
或者在main
函数之前将函数本身移动到代码中的某个位置。
此外:
count
和countoccurences
变量初始化为零
fp != NULL
。如果无法打开文件,fopen
将返回NULL。 当我运行程序时,。/ main今天是一个美好的一天
当你以这种方式运行程序时,你传递了5个参数,一个用于句子中的每个单词。在main
中查看您的函数和函数调用:函数需要文件名进行搜索,这应该是程序的第一个参数,而不是要搜索的文本。第二个参数应该是要搜索的字符。
由于您没有检查fopen
的返回值,因此您的调用会导致问题,因为您可能没有有一个名为 Today 在工作目录中。
答案 1 :(得分:2)
错误表示函数声明或定义在调用它时不可见。移动定义或在main()
之前添加声明。
其他要点:
fopen()
count
buf
是未使用的本地变量例如:
FILE *fp = fopen(filename,"r");
if (fp)
{
int ch,count=0;
while ((ch = fgetc(fp)) != EOF)
{
if (ch == c) count++;
}
fclose(fp);
}
else
{
fprintf(stderr,
"Failed to open %s: %s\n",
filename,
strerror(errno));
}
答案 2 :(得分:2)
C需要在通话前了解您的功能签名。之一:
在电话会议前(当然在全球范围内)发表声明
int countoccurrences(char *filename, char c);
您还需要初始化计数(大概为0)。您应确保使用正确的值调用它。如果要使用第二个参数的第一个字符,则应使用argv[2][0]
。