C:解析由字符分隔的char数字数组,并将数字转换为整数

时间:2012-04-06 13:40:13

标签: c string bioinformatics atoi

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

例如=“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.例如,使用示例字符串I如上所列,第一次循环将到达该区域,我预计pre将包含“28”,但它包含“280”!当我使用atoi来转换字符串时,它比我预期的高十倍。
有什么我缺少的东西或C中的一些char数组约定,我在这里不知道吗?提前感谢您的回复。

2 个答案:

答案 0 :(得分:0)

这可能不是唯一的问题,但您不会将传递给atoi的字符串置零。 '0'第三个位置的280字符可能是垃圾,因为你从未写过数组的那个位置。

要解决此问题,您应在调用atoi之前添加此行:

pre[pri] = '\0';

答案 1 :(得分:0)

以下代码将提取(并打印)数字&amp;字符串的非数字部分;你可以根据这些部分调整它来做你需要的。

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++;
}