我有两个用于打印基因的功能,另一个用于从字符串创建dna。后一个函数采用类似“ATCGGGAAC”的方法,并创建一个类型为char的结果,如result = {{“ATC”},{“GGG”,},{“AAC”}};但是当打印结果ı得到ATCGGGAAC时,我的目的是打印像ATC GGG AAC我的功能有什么问题?首先是打印功能;
更清楚;
这个函数应该采用dnaString(char *)并创建一个DNA(char **)。当dnaString为NULL时,返回NULL并且不执行任何操作。否则确保DNA的每个部分都有3个核苷酸。请参阅上面的DNA / RNA STRUCTURE部分以了解结构。
Dinstring:Ajittagatggchchtatgtt 脱氧核糖核酸:在sigg tig 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;
}
}
乍一看,你的printGenes
功能看起来不错。 generateDNA
有几个指针相关的问题。让我看看我是否可以画出来:
请记住,在C中,所有字符串都以'\ 0'结尾,并且任何与字符串相关的函数都将继续,直到找到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);
您的打印功能是正确的,但我在您的代码中的其他地方看到了一些问题。
首先,你要两次增加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[]
的每个元素,你的打印功能将产生你期望的输出。