0

配列アラインメント プログラムによって作成された一部の文字列に問題があります (これはバイオインフォマティクス プロジェクトです)。アラインメント ファイルを解析する既存の C プログラムに機能を追加しようとしていますが、プログラムが作成する「不一致」文字列の解析で問題が発生しました。コンテキストを追加するために、アライメント文字列の例を

次に示します。

文字列を解釈する方法は次のとおりです。最初の 28 塩基が配列と一致し、次に「G」の不一致 (合計 29 番目の塩基)、次の 11 塩基の一致 (合計 40 番目の塩基)、「A」の不一致 (合計 41 番目の塩基) があります。 )、「C」の不一致 (合計 42 塩基) など...

不一致がある (つまり、文字列に数字ではなく文字が含まれている) ベース位置を見つけ、それを int 配列に格納して、後のサブルーチンでこれを検索できるようにする必要があります。

だからここで私の問題が出てきます。これを解析できると「思った」サブルーチンを書きましたが、出力から非常に奇妙なアーティファクトが得られます。注: 私のひどい雑然としたコードを許してください! 私は決して C プログラマーではなく、私のトレーニングはコンピューター サイエンスではありません。

int errorPosition(char *mis_match, int *positions){
    int i = 0; //iterator for loop
    int pi = 0; //position array iterator
    int in = 0; //makeshift boolean to tell if values are inside the pre array
    int con = 0; //temporary holder for values converted from the pre array
    char pre[5]; //this array will hold the digit values that will be converted to ints
    pre[0] = '\0';
    for (i = 0; i < strlen(mis_match); i++){
        if(isalpha(mis_match[i]) && in == 1){
            con += atoi(pre);   // this is the part where I get an artifact (see below)
            positions[pi] = con;
            con++;
            pi++;
            in = 0;
            memset(&pre[0], 0, sizeof(pre));
            pri = 0;
        }else if(isalpha(mis_match[i]) && in == 0){
            positions[pi] = con;
            con++;
            pi++;
        }else if(isdigit(mis_match[i])){
            pre[pri] = mis_match[i];
            pri++;
            in = 1;
        }
    }
    if(pri > 0){
        con += atoi(pre);
        positions[pi] = con;
        pi++;
    }

}

したがって、私の問題は、上記でコメントしたセグメント (「ここでエラーが発生する場所です」) に到達すると、「前の」文字列に数字の 10 倍が含まれることです。たとえば、上記の例の文字列を使用すると、ループが最初にその領域に到達したとき、pre には "28" が含まれていると予想されますが、代わりに "280" が含まれています。したがって、atoi を使用して文字列を変換すると、予想よりも 10 倍高くなります。
私が見逃しているもの、またはここで知らない C の char 配列規則はありますか? 返信ありがとうございます。

4

2 に答える 2

0

これが唯一の問題ではないかもしれませんが、に渡す文字列をゼロで終了していませんatoi。の'0'3 番目の位置にある文字は280、配列のその位置に書き込んだことがないため、ガベージである可能性があります。

この問題に対処するには、次の行を の呼び出しの前に追加する必要がありますatoi

pre[pri] = '\0';
于 2012-04-06T13:51:02.837 に答える
0

次のコードは、文字列の数値部分と非数値部分を抽出 (および出力) します。それらの部分で必要なことを行うように適応させることができます。

char* example = "28G11AC10T32";
int pos = 0;
int value = 0;
while ( 1 ) {
    if ( !isdigit(example[pos]) ) {
        if ( value > 0 )
            printf( "Number = %d\n", value );
        value = 0;
        if ( example[pos]==0 )
            break;
        else
            printf( "Char = %c\n", example[pos] );
    } else {
        value = value * 10 + example[pos]-'0';
    }
    pos++;
}
于 2012-04-06T14:00:24.230 に答える