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

时间:2018-04-30 21:19:25

标签: c

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

2 个答案:

答案 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);