-2

getline 関数の独自の動的メモリ バージョンを実装しました。

char * fgetline(FILE * f)

30 文字のバッファーから開始し、バッファーがいっぱいになると、新しいバッファーを割り当てて内容をコピーし、古いバッファーを解放します。関数から取得したとき、EOFまたは\n関数から戻ったとき。

この関数を使用して、プログラム tail のバージョンを実装したいと考えています。入力は stdin から行われ、出力は stdout に送られます。最初の引数が で始まる場合、 の-後のすべて-が出力する行数です。引数が指定されていない場合、出力するデフォルトの行数は 10 です。

私は今まで、関数を使用する必要があると考えていました:

int atoi (const char *s) 

fromstdlib.hと行へのポインターの配列がありますが、これを行う方法が正確にはわかりません。

何か案は?

4

1 に答える 1

1

main関数を次のように宣言します

 int main (int argc, char**argv) {
 }

プログラムをmyprog実行可能ファイルにコンパイルし、それを呼び出すと、次のmyprog -20 somefile anotherfileようになります。

argc == 4 
&& strcmp(argv[0], "myprog") == 0
&& strcmp(argv[1], "-20") == 0
&& strcmp(argv[2], "somefile") == 0
&& strcmp(argv[3], "anotherfile") == 0
&& argv[4] == NULL

言い換えれば、プログラムに以下を含めたい場合があります。

int nblines = 10;

int main(int argc, char**argv) {
  int argix = 1;
  if (argc>1) {
    if (argv[1][0]=='-') 
      { 
         nblines = atoi(argv[1]+1);
         argix = 2;
      }
     for (; argix < argc; argix++)
        tail (argv[argix]);
  }
  return 0;
}

void tail(char*filename);関数を適切に実装するのはあなた次第です。gcc -Wall -gLinuxの場合など、すべての警告とデバッグ情報を含めてコンパイルすることを忘れないでください。デバッガー ( gdbLinux の場合) を使用して、プログラムをデバッグします。fopen失敗する可能性があることを考慮しerrno、適切なエラー メッセージを表示するために使用します。

関数は必要ないことに注意してくださいfgetlinegetline(3)関数 は標準 (Posix 2008) であり、ライン バッファーを動的に割り当てます。

于 2012-10-27T12:54:23.760 に答える