0

g++ でコンパイルされたプログラム seg がstrncat()呼び出しで失敗する理由を理解するのに苦労しています。

私はこのサイトと一般的なグーグルを飛び回っていて、多くの同様の問題を見つけましたが、私にとってうまくいく解決策は見つかりませんでした. これははるかに大きなコードの一部であり、コードが私のものではないため、変数を再定義するためにできることは限られています。

コードのこのセクションで行うことはすべて、ファイルの最後の行を読み取り、関連するデータを削除して char* に連結することです

実行すると、次の行でセグメンテーション違反が発生しますstrncat(RAM,nextchar,1)

char line[256]={"0"};
char nextchar[10]={"0"};
int length=0;
double rac;
double decc;
bool SPACE=false;
char * RAM="RA: ";
char * DECM="DEC: ";
if(AutoColData.good()){
    while(!AutoColData.eof()) AutoColData.getline(line,256);
    for(int i=0;i<strlen(line);i++){
        nextchar[0]=line[i];
        cout<<line[i];
        if(isspace(nextchar[0])&& !SPACE)   SPACE=!SPACE;
        else if(SPACE && !isspace(nextchar[0])){
            SPACE=!SPACE;
            length++;
        }
        if(length==6) {
          cout<<"\n"<<RAM<<nextchar<<"\n";
          strncat(RAM,nextchar,1);
        }
        else if(length==7) strcat(DECM,nextchar);
    }
}

ここにはずさんな選択肢がいくつかありますが、私は知っています(「スペース」全体が乱雑です)。しかし、これが Seg Fault になる理由はわかりません。strncat() のある行までは問題なく動作します。cout は正常に動作し、両方の文字列が出力され、正しいデータが含まれていますが、strncat は失敗します。私はmalloc()、文字列を使ってみましたが、何もうまくいかないようです。誰かが私がやっている愚かなことを指摘できれば、それは非常に役に立ちます. ありがとうございました。

4

1 に答える 1

7

RAM文字列リテラルは読み取り専用char *であり、書き込みは許可されていません。あなたの呼び出しは単に未定義の動作です。const char *strncat

書き込み可能な文字列が必要な場合は、十分な大きさの char 配列を作成できますchar RAM[100] = "RA: ";(これは後ろにゼロが埋め込まれます) std::string

std::string RAM = "RA: ";
RAM += nextchar;
于 2012-06-08T23:21:23.777 に答える