为什么程序在没有空格的情况下编写dna

问题描述 投票:0回答:2

我有两个用于打印基因的功能,另一个用于从字符串创建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;
    }
}
c
2个回答
0
投票

乍一看,你的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);

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[]的每个元素,你的打印功能将产生你期望的输出。

© www.soinside.com 2019 - 2024. All rights reserved.