DNA转换为蛋白质-C结构问题



我正在致力于将DNA序列转化为蛋白质序列。
我已经完成了所有程序,我发现有一个结构的错误。
dna_codon是一种结构,我在它上进行迭代。在第一次迭代中,它显示了正确的结构值,但是从下一个迭代开始,它不会显示在结构中存储的正确值。

这是一个很小的错误,所以不要以为我做任何事情并低估了。我之所以被困在这里,是因为我是C的新来的结构。

代码:

#include <stdio.h>  
#include<string.h>

void main()
{
int i, len;
char short_codons[20];
char short_slc[1000];
char sequence[1000];
struct codons
{
    char amino_acid[20], slc[20], dna_codon[40];
};
struct codons c1 [20]= {
                        {"Isoleucine", "I", "ATT, ATC, ATA"},
                        {"Leucine", "L", "CTT, CTC, CTA, CTG, TTA, TTG"},
                        {"Valine", "V", "GTT, GTC, GTA, GTG"},
                        {"Phenylalanine", "F", "TTT, TTC"},
                        {"Methionine", "M", "ATG"},
                        {"Cysteine", "C", "TGT, TGC"},
                        {"Alanine", "A", "GCT, GCC, GCA, GCG"},
                        {"Proline", "P", "CCT, CCC, CCA,CCG "},
                        {"Threonine", "T", "ACT, ACC, ACA, ACG"},
                        {"Serine", "S", "TCT, TCC, TCA, TCG, AGT, AGC"},
                        {"Tyrosine", "Y", "TAT, TAC"},
                         {"Tryptophan", "W", "TGG"},
                        {"Glutamine", "Q", "CAA, CAG"},
                        {"Aspargine","N" "AAT, AAC"},
                        {"Histidine", "H", "CAT, CAC"},
                        {"Glutamic acid", "E", "GAA, GAG"},
                        {"Aspartic acid", "D", "GAT, GAC"},
                        {"Lysine", "K", "AAA, AAG"},
                        {"Arginine", "R", "CGT, CGC, CGA, CGG, AGA, AGG"},
                        {"Stop codons", "Stop", "AA, TAG, TGA"}
                        };

int count = 0;
printf("Enter the sequence: ");
gets(sequence);
char *input_string = sequence;
char *tmp_str = input_string;
int k;
char *pch;
while (*input_string != '')
{
    char string_3l[4] = {''};
    strncpy(string_3l, input_string, 3);
    printf("n-----------%s & %s----------", string_3l, tmp_str );
    for(k=0;k<20;k++)
    {
        //printf("@REAL -  %s", c1[0].dna_codon);
        printf("@ %s", c1[k].dna_codon);
        int x;
        x = c1[k].dna_codon;
        pch = strtok(x, ",");
        while (pch != NULL)
        {
            printf("n%d : %s with %s", k, string_3l, pch);
            count=strcmp(string_3l, pch);
            if(count==0)
            {
                strcat(short_slc, c1[k].slc);
                printf("n==>%s", short_slc);
            }
        pch = strtok (NULL, " ,.-");
        }
    }
input_string = input_string+3;
}
printf("nProtien sequence is : %sn", short_slc);
}

输入:

TAGTAG

输出:
如果您看到

的输出
printf("n-----------%s & %s----------", string_3l, tmp_str );   

在两种迭代中,我们都发现结构中定义的值降低了。

我想知道为什么结构会减少它或我的错误?因为我被困在这里

所需的输出:

StopStop

strtok()必须仅在字符串的重复副本上使用,因为它覆盖了"分界符"。在必要时使用' 0'生成令牌。

下面的代码将切碎字符串:

x = c1[k].dna_codon;
pch = strtok(x, ",");

例如:

String = "CTT, CTC, CTA, CTG, TTA, TTG"

第一次strtok()调用A' 0'overwrites','

String = "CTT"" CTC, CTA, CTG, TTA, TTG"切碎字符串。添加了' 0'以供可读性。

由于strtok()将其保留为弦的其余部分,因此您可以安全地使用第一个循环。在第二个循环期间仅是:

String = "CTT"

ps:对于性能,您可以使用各种字符串,而不是dna_codon[40]或可行的链接列表。每次比较的切碎/定位定界符都是开销。

IEEE STD 1003.1-2008 strtok()

尽管我不知道您想要哪种输出。但是,如果直接运行您的代码,我会有一个段错误。

  1. 切勿使用gets()。这个非常重要。而是使用fgets()。您可以写fgets(sequence, 1000, stdin)
  2. strtok修改dna_codon时,与X无关。没有什么可以从外部停止strtok
  3. 如果要拆分dna_codon并且不想修改它,则应制作字符串的副本。使用strcpy(char*,char*)。这将制作一个真实的副本(两个字符串)。如果您只是将字符串分配给另一个变量。它们只是指向同一字符串的两个指针。

    char x [40];strcpy(x,c1 [k] .dna_codon);//而不是x = dna_codon

最新更新