0

テキスト ファイルから読み取り、特定の単語 (より具体的には「CH3」などの種名) を検索し、その下にリストされているデータを読み取るコードがあります。main で宣言されているファイル名と種名を含む文字列の配列でvoid read_data(char *fargs[], double *data)ある関数を宣言します。fargs次に、strstr(「CH3ONO2」ではなく「CH3」など) を使用して正しい種名を見つけていることを確認するために、種名の両側にスペースを入れる短いループを作成しました。

char *spec;
int x;
spec[0] = ' ';
while (fargs[1][x]) {
    spec[x+1] = fargs[1][x];
    x++;
}
spec[x+1] = ' ';
spec[x+2] = '\0';

したがって、問題は、これを行うと、プログラムが後でセグメンテーション違反を発生させることです(strstrの場合ではなく、ループの有無にかかわらず正常に動作します)。このループを含めずにすべての操作を実行するとfargs[1]、プログラムは機能しますが、上記の仮説のように間違った種名が見つかることがあります。ループを含めただけで、二度と使用しない場合specでも機能しません。これはfargs[1]、ループ内で何らかの変更を加えていることを示唆しています。また、後で使用することを明確にするためstrcmpfargs[1]、宣言にスペースを含めただけでも、操作する必要がありますfargs[1]同様の方法でスペースを削除します。より多くのコード、プログラム出力、読んでいるテキストファイルの例などを完全に投稿できます。それが役立つ場合は、巨大なコードの壁を投稿したくありませんでした。それ。

4

3 に答える 3

0

specは初期化されないため、の仕様から読み取るとspec[0]、未定義の動作が発生します。

コードのもう1つの問題は、x初期化されないことです。

于 2012-08-29T15:35:05.023 に答える
0

このコードを見ていると、(何かが欠けていない限り) にスペースを割り当てていないように見えます*spec。またx、値が定義されていないため、完全にランダムです。これを試してください:

char *spec = NULL, *tmp;
int bff = 256, x = 0;

if(!(spec = malloc(bff)))
{
    //memory allocation failed
}
while (fargs[1][x])   
{
    if(bff <= x + 3)
    {
        bff *= 2;
        if(!(tmp = realloc(spec, bff)))
        {
            free(spec);
            //memory allocation failed
        }
        spec = tmp;
    } 
    spec[x + 1] = fargs[1][x];
    x++;
}
if(!(tmp = realloc(spec, x + 2)))
{
    free(spec);
    //memory allocation failed
}
spec = tmp;
spec[x + 1] = ' ';
spec[x + 2] = '\0';
//do what you need to do with spec
free(spec);

}

テキストボックスにフリーハンドで入力しましたが、微調整が必​​要かもしれませんが、良いスタートになるはずです。

于 2012-08-29T15:43:45.327 に答える
0

実際には、他の文字または文字列のアドレスを保持する char 型のポインターを作成しました。

しかし、配列として考えて、そのポインターに文字を直接配置しました。配列はポインターのように動作しますが、あなたがしていることは正しいという意味ではありません。

文字列全体を保持するには、 malloc(N*sizeof(char)) を使用する必要があります。

したがって、プログラムでは、持っていないアドレスにアクセスしている可能性があります。そのため、segfault が発生しています

于 2012-08-29T15:41:05.067 に答える