0

我对序列比对程序(这是一个生物信息学项目)创建的一些字符串有疑问。我正在尝试向解析对齐文件的现有 C 程序添加附加功能,但在解析程序创建的“不匹配”字符串时遇到了一些问题。添加一些上下文,这里是一个对齐字符串的例子:

example = "28G11AC10T32";

下面是如何解释字符串:前 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++;
    }

}

所以,我的问题是,当我到达上面评论过的部分时(“这是我得到错误的地方”),我的“pre”字符串包含数字乘以 10。例如,使用上面列出的示例字符串,循环第一次到达该区域时,我希望 pre 包含“28”,但它包含“280”!当我使用 atoi 转换字符串时,它比我预期的要高十倍。
是否有一些我遗漏的东西或 C 中的一些我不知道的字符数组约定?预先感谢您的回复。

4

2 回答 2

0

这可能不是唯一的问题,但您不会以零结尾传递给atoi. 的'0'第三个位置的字符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 回答