配列アラインメント プログラムによって作成された一部の文字列に問題があります (これはバイオインフォマティクス プロジェクトです)。アラインメント ファイルを解析する既存の 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 配列規則はありますか? 返信ありがとうございます。