0

私はクレイグリストの結果のリストをフィルタリングするプログラムに取り組んでいます。比較的安い賃貸部屋を探したいです。完成したプログラムは、600ドルを超える価格の行を削除し、新しいファイルを作成しますが、今のところ、$文字を含むすべての行を削除し、端末に印刷しています。

このプログラムは、独自のソースで実行すると正常に動作しますが、Firefoxから保存されたクレイグリストの結果のhtmlページで実行すると、閉じ括弧まで印刷され、スタックスマッシング検出警告とバックトレースがスローされます。私はK&RからCを学んでいるので、このコードが時代遅れに見える場合はそれが理由です。

# include <stdio.h>
# define MAXLINE 300

main()
{
    char line[MAXLINE];
    int c;//current character
    int p = 0;//position in the line
    int flag = 0;//there is a dollar sign

    while ((c = getchar()) != EOF){
        line[p++] = c;
        if (c == '$'){
            flag = 1;
        }
        if (c == '\n'){
            if(flag == 0){//there was no $, print the line
                int i;
                for(i=0;i<p;i++){
                    putchar(line[i]);
                    line[i] = '\0';
                }
            }
            p = 0;
            flag = 0;
        }
    }
}
4

1 に答える 1

4

問題は、HTML に MAXLINE 文字を超える行が少なくとも 1 行含まれていることだけだと思います。配列のサイズを超えようとしているかどうかはどこにもチェックしません。もしそうなら、あなたは確かにスタックを壊します。ループは 未満whileかどうかを確認し、そうでない場合はメッセージを出力して停止します。プログラムにかなり大きな変更を加えなければ、他に何もできません。pMAXLINE

于 2011-09-24T01:24:51.557 に答える