我遇到了序列比对程序创建的一些字符串的问题(这是一个生物信息学项目)。我正在尝试向解析对齐文件的现有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数组约定,我在这里不知道吗?提前感谢您的回复。
答案 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++;
}