-1

Brian Kernighan と Dennis Ritchie によって書かれた "The C Programming Language" から次のコードを取得しました。ただし、gcc ではコンパイルされません。

    #include <stdio.h>
    #include <string.h>
    #define MAXLINE 1000

    int getline(char *line, int max);

    {
     char line[MAXLINE];
     int found = 0;

     if (argc != 2)
      printf("Usage: find pattern\n");
     else
      while (getline(line, MAXLINE) > 0)
       if (strstr(line, argv[1])  != NULL) {
          printf("%s", line);
          found++;
       }
      return found;
    }

私が得るのは次のとおりです: エラー: 予想される識別子または '(' before '{'.

私は何を間違っていますか?

4

5 に答える 5

2

この答えが言うように、main関数を宣言する行を省略しました。

この行:

int getline(char *line, int max);

関数の宣言であり、別の場所で定義getlineする必要があります。( を削除した場合、 の完全な定義の最初の行になる可能性もありますが、それは意図していないようです。);getline

この場合、別のソース ファイルで定義することが意図されているようです。そのソース ファイルとこのソース ファイルの両方をコンパイルし、リンカーを使用してそれらを実行可能プログラムに結合する必要があります。

ただし、別の問題が発生する可能性があります。一部の実装では、 と呼ばれる独自の非標準関数が提供されてgetlineおり、宣言した方法と互換性がありません。-ansigcc を使用している場合は、またはなどの非標準定義を禁止するオプションを使用してコンパイルする必要があります-std=c99getline簡単にするために、 ;以外の名前を使用することを検討してください。get_line大丈夫なはず。

そしてもちろん、getlineorget_line関数をどこかで定義する必要があります。(必要に応じて、定義を同じソース ファイルに入れることもできますが、この演習のポイントは、複数のソース ファイルからプログラムを構築することだと思います。)

于 2013-10-02T15:38:08.147 に答える
1

この行を見逃したと思います:

main(int argc, char *argv[])

Visual C++ でのデバッグ時に main() の引数が無視される

于 2013-10-02T15:02:56.340 に答える
1

;から 削除

int getline(char *line, int max);  
                                ^
                                |
                             remove this semicolon 
于 2013-10-02T14:55:13.730 に答える
0
int getline(char *line, int max);   // <-- Delete that semi-colon
{
于 2013-10-02T14:55:05.643 に答える
0

セミコロンを削除します。

int getline(char *line, int max)

于 2013-10-02T14:55:12.670 に答える