我有两个用于打印基因的功能,另一个用于从字符串创建dna。后一个函数采用类似“ATCGGGAAC”的方法,并创建一个类型为char的结果,如result = {{“ATC”},{“GGG”,},{“AAC”}};但是当打印结果ı得到ATCGGGAAC时,我的目的是打印像ATC GGG AAC我的功能有什么问题? 首先是打印功能;
更清楚;
这个函数应该采用dnaString(char *)并创建一个DNA(char **)。 当dnaString为NULL时,返回NULL并且不执行任何操作。否则做 确保DNA的每个部分都有3个核苷酸。见DNA / RNA 上面的STRUCTURE部分了解结构。
dnaString:AGCTTGAATCGGCCTTAATGTTTT
DNA:AGC TTG AAT CGG CCT TAA TGT TTT
/* prints DNA or RNA */
void printGenes(char** dnaOrRna) {
int i = 0;
if (dnaOrRna == NULL) {
printf("No genes found.\n");
}
else {
/* while current gene is not NULL, print gene */
while (dnaOrRna[i] != NULL) {
/* if next gene is not NULL, print with space */
if (dnaOrRna[i+1] != NULL) {
printf("%s ", dnaOrRna[i]);
}
/* if next gene is NULL, print without space */
else {
printf("%s", dnaOrRna[i]);
}
i++;
}
/* print additional newline */
printf("\n");
}
}
其次我的函数从字符串生成dna;
char** generateDNA(char *dnaString)
{ if(*dnaString)
{ int i;
char *temp;
char **result;
int size=getStringLength(dnaString);
temp=(char*)malloc(sizeof(char)*3);
temp=dnaString;
result=(char**)malloc(1+size/3);
for(i=0;i<size/3;i++)
{
result[i]=temp;
temp=temp+3;
i++;
}
result[size/3]=NULL;
printGenes(result);
return result;
}
else
{
return NULL;
}
}
答案 0 :(得分:0)
您的打印功能正确,但我在您的代码中看到了其他一些问题。
首先,您要递增i
两次:
for(i=0; i<size/3; i++)
{
...
i++;
}
其次(我认为这是与您的问题相关的主要问题),当您分配result[i]
时,您没有终止该字符串。所以,你最终得到了来自“AAACCCGGGTTT”的输入:
result[0] AAACCCGGGTTT
result[1] CCCGGGTTT
result[2] GGGTTT
result[3] TTT
我相信当你打印result[0]
时,你会看到DNA字符串的'无空格'版本。当我删除冗余i++
并运行您的代码时,我收到了此输出:
AAACCCGGGTTT CCCGGGTTT GGGTTT TTT ....
“......”是一堆额外的字节,因为result[3]
也没有终止而打印出来。
请注意,输出 之间有空格,例如AAACCCGGGTTT和CCCGGGTTT等。所以,你需要做的就是空终止result[]
的每个元素,你会您的打印功能将产生您期望的输出。
答案 1 :(得分:0)
乍一看,您的printGenes
功能看起来不错。 generateDNA
有两个与指针相关的问题。让我看看我是否可以画出来:
请记住,在C中,所有字符串都以&#39; \ 0&#39;并且任何与字符串相关的函数都将继续,直到找到NULL。
在generateDNA
的开头,我们有一个字符串:
dnaString
|
v
"ATCGGGAAC\0"
然后为temp
分配一个小字符串:
dnaString
|
v
"ATCGGGAAC\0"
temp
|
v
"xxx" // uninitialized garbage data
然后,您将temp
指向与dnaString
相同的字符串。请注意,您现在已经泄漏了3个字节的内存,因为没有任何内容指向原来的temp
缓冲区了:
dnaString
|
v
"ATCGGGAAC\0"
^
|
temp
"xxx" // uninitialized garbage data (leaked)
然后分配一个数组,并填充它:
[0]
dnaString
|
v
"ATCGGGAAC\0"
^ ^
| |
| temp
result[0]
"xxx" // uninitialized garbage data (leaked)
[1]
dnaString
|
v
"ATCGGGAAC\0"
^ ^ ^
| | |
| | temp
| result[1]
result[0]
"xxx" // uninitialized garbage data (leaked)
等等。
现在,这意味着result[0]
指向字符串"ATCGGGAAC\0"
,result[1]
指向字符串"GGGAAC\0"
,这几乎肯定不是您的意图。
你可能想要这样的东西(未经测试),其中result []中的每个元素都指向它自己的字符串:
int size=getStringLength(dnaString);
temp=dnaString;
result=(char**)malloc(sizeof(char*) * (1+size/3));
for(i=0;i<size/3;i++) {
result[i] = (char*)malloc(sizeof(char) * 4);
memcpy(result[i], temp, 3);
result[i][3] = NULL;
temp += 3;
}
result[size/3]=NULL;
printGenes(result);