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

        FILE *inFilePtr = fopen(*(argv + 1), "r");
        char *rawdata = malloc(sizeof(char) * 100);
        float *ary = malloc(sizeof(float) * 50);
        int counter = 0;
        float averageAns;
        int count = 0;


        while (count < 1 ){
            //fgets(rawdata, 50, inFilePtr); //I have tried both
            fscanf(inFilePtr, "%s", rawdata);
            *(ary + counter) = atof(strtok(rawdata, ","));
             counter++;
            *(ary + counter ) = atof(strtok(rawdata, NULL));
            counter++;
            *(ary + counter) = atof(strtok(rawdata, NULL));
             counter++;
            count++;
        }

なぜセグフォルトが発生し続けるのか、一生わかりません。ループがなくてもセグ フォールトが発生します (カウント < 1 は、一度通過できるかどうかを確認するためだけでした)。

fgets()、fscanf() では機能しません。fgets のストリームを (stdin) に変更すると、セグ フォールトが発生します。ファイル * が問題であると想定したため、これについて言及しますが、今はそうではないと思います。データ ファイルに区切り文字 " " と "," を作成しました。

誰かが私が間違ったことを知っているなら、私はそれを感謝します.

4

2 に答える 2

2

出力引数を指定していないため、への呼び出しfscanfは失敗することが保証されています。次のようになります。

fscanf(inFilePtr, "%s", rawdata);

への呼び出しstrtokも無効です。同じ文字列を引き続きトークン化するには、 の最初の引数を;にstrtokする必要があります。は、2 番目の引数が引き続き有効な文字列であることを期待しています。NULLstrtok

これらの問題はそれぞれ、単独でセグメンテーション違反を引き起こします。将来のデバッグを容易にするために、デバッグしているステートメントの後にデバッガーを使用してブレークポイントを設定するか、segfault が予想される他の行をコメントアウトすることをお勧めします (通常、コードもろい状態です。

また、スタイルの問題として、

*(ary + counter)

普通に書いてある

ary[counter]
于 2013-02-05T05:09:20.807 に答える
0

(char *) で malloc 呼び出しをキャストしてみてください

たぶん、たぶん:ary[counter++] = atof(strtok(rawdata, ","));

于 2013-02-05T05:30:24.150 に答える