我对序列比对程序(这是一个生物信息学项目)创建的一些字符串有疑问。我正在尝试向解析对齐文件的现有 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 中的一些我不知道的字符数组约定?预先感谢您的回复。