Unixコマンドラインを介して特定のファイルの行をカウントするユーティリティを書いています。通常、これは私にとっては非常に単純ですが、どうやら私は主要なオフナイトを過ごしています。このプログラムの目的は、コマンドラインから不明な数のファイルを取り込み、それらをバッファーに読み込んで、改行文字を確認することです。簡単に聞こえますか?
int size= 4096;
int main(int argc, char *argv[]){
int fd, i, j, c, fileLines, totalLines;
char *buf= (char *)malloc(size); //read buffer
for (i=2; i<argc; i++){ //get first file
fileLines=1;
if ((fd=open(argv[i], O_RDONLY))!= -1){ //open, read, print file count, close
while ((c= read(fd, buf, size))!= 0){
for (j=0; j<size; j++){
if (buf[j] == '\n')
fileLines++;
}
}
}
printf("%s had %d lines of text\n", argv[i], fileLines);
totalLines+= fileLines;
close(fd);
}
printf("%d lines were counted overall\n", totalLines);
return 0;
}
私には2つの問題があります。1つ目は、最初のprintfステートメントがデバッガーの外部で実行されることはないということです。2つ目は、totalLinesの印刷出力は約175K行である必要がありますが、印刷される値は約767倍大きくなります。
関連するすべての変数が変更の範囲外であると宣言されているため、これを理解するのに問題がありますが、それでも、最初の印刷状態と行カウンターの更新が、異常なtotalLinesとともにデバッガーの外部で無視される理由を説明していません結果
どんな助けでも大歓迎です。
答え
2つの変更が提案されました。
1つ目はに変更j<size
することでしたj<c
。これは必要なソリューションではありませんでしたが、適切なコーディング規約に従っています
2つ目はに変更i=2
することでしたi=1
。元の開始変数を使用した理由は、デバッガー実行可能ファイルを開始した方法でした。gdbコマンドラインでrun lc1 f1.txt
、デバッガーを起動するために入力しました。その結果、arglistには3つの変数がありrun f1.txt
、教授が最初の例を使用してgdbを紹介してくれたので、それが完全に適切かどうかはわかりませんでした。