1

该函数是这样调用的,

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)

4

3 回答 3

3

看起来您countoccurrencesmain定义之前正在使用您的函数。

在之前添加函数签名main

int countoccurrences(char *, char);

或者将函数本身移动到代码中main函数之前的位置。

还:

  • 您需要count在 中将变量初始化为零countoccurences,并且
  • fp != NULL你应该在使用文件指针之前检查一下。fopen如果无法打开文件,将返回 NULL。

当我运行程序时,./main 今天是美好的一天

当您以这种方式运行程序时,您将传递 5 个参数,一个用于句子中的每个单词。检查你的函数和你的函数调用main:函数需要一个文件名来搜索,它应该是你程序的第一个参数,而不是要搜索的文本。第二个参数应该是要搜索的字符。

由于您没有检查 的返回值fopen,因此您在此处的调用将导致问题,因为您的工作目录中可能没有名为Today的文件。

于 2012-09-30T21:47:16.690 回答
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));
}
于 2012-09-30T21:45:33.250 回答
2

C 需要在调用之前了解您的函数签名。任何一个:

  1. 在调用之前移动你的函数,或者
  2. 在调用之前放置一个声明(当然是在全局范围内)

    int countoccurrences(char *filename, char c);

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

于 2012-09-30T21:46:35.360 回答