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 今日は美しい日です

この方法でプログラムを実行すると、文の各単語に 1 つずつ、合計 5 つの引数が渡されます。関数と の関数呼び出しを確認してください。関数は、検索mainするファイル名を必要としています。これは、検索するテキストではなく、プログラムの最初の引数にする必要があります。2 番目の引数は、検索する文字にする必要があります。

の戻り値をチェックしていないため、作業ディレクトリにTodayという名前のファイルがないfopen可能性があるため、ここで呼び出すと問題が発生します。

于 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);

また、count を初期化する必要があります (おそらく 0 に)。正しい値で呼び出していることを確認する必要があります。2 番目のパラメーターの最初の文字を使用する場合は、argv[2][0].

于 2012-09-30T21:46:35.360 に答える