如何计算文件中字符的出现次数?

时间:2012-09-30 21:39:56

标签: c file

该函数被调用,

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)

3 个答案:

答案 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需要在通话前了解您的功能签名。之一:

  1. 在通话前移动您的功能,或
  2. 在电话会议前(当然在全球范围内)发表声明

    int countoccurrences(char *filename, char c);

  3. 您还需要初始化计数(大概为0)。您应确保使用正确的值调用它。如果要使用第二个参数的第一个字符,则应使用argv[2][0]