私は課題を完了しました (はい、それはプログラミングのクラスのためです) が、残念ながら、可能な限り最も効率的な方法でそれを進めていませんでした。これは基本的に uniq プログラムであり、ファイル内の隣接する行を比較し、繰り返される行のコピーを 1 つだけ出力します。いくつかのメモ: printUniq() は、さまざまなフラグを考慮した独自の関数です。readline() は、malloc と realloc を使用して任意の長さの行を char * バッファーに読み込む別の関数です。以下が気になる部分です。
if(prevline != NULL)
{
while(thisline != NULL)
{
while(thisline != NULL && strcmp(prevline, thisline) == 0)
{
count++;
free(prevline);
prevline = thisline;
thisline = readline(stream);
}
printUniq(prevline, cflag, dflag, uflag, count);
count = 1;
free(prevline);
if (thisline != NULL)
{
prevline = thisline;
if((thisline = readline(stream)) == NULL)
{
printUniq(prevline, cflag, dflag, uflag, count);
}
}
}
このプログラムを構成するより良い方法はありますか? ループで thisline の NULL を 3 回チェックする必要がありません。外側の while ループの最初の NULL チェックが必要であり、最後の行が重複している場合に備えて、ネストされた while の次のチェックが必要です。free の呼び出し後の次のチェックでは、基本的に、thisline が null であるために「重複ループ」が終了したかどうかをチェックし、そうでない場合は、プログラムが別の行を取得できるようにします。次に、次のチェックはファイルの最後の行に対してのみ行われます。これが存在しない場合、 readline が null を返す (ファイルにそれ以上の行がない) と、ループが終了し、prevline が出力されないためです。
とにかく、どんな助けでも大歓迎です。