我正致力于将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 != '\0')
{
char string_3l[4] = {'\0'};
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 : %s\n", short_slc);
}
INPUT:
TAGTAG
输出:
如果你看到
printf("\n-----------%s & %s----------", string_3l, tmp_str );
在两次迭代中,我们发现结构中定义的值减少了。
我想知道为什么结构减少它或我的错误?因为我被困在这里
需要输出:
StopStop
答案 0 :(得分:2)
strtok()
必须仅用于字符串的重复副本,因为它会用'\ 0'覆盖“分隔符”以在必要时生成标记。
下面的代码会砍掉字符串:
x = c1[k].dna_codon;
pch = strtok(x, ",");
e.g:
String = "CTT, CTC, CTA, CTG, TTA, TTG"
首先strtok()
调用'\ 0'后覆盖'','
String = "CTT"\0" CTC, CTA, CTG, TTA, TTG"
砍掉字符串。为了便于阅读,添加了'\ 0'。
当strtok()
保持指向字符串其余部分的指针时,您对第一个循环是安全的。在第二个循环期间,字符串只会是:
String = "CTT"
PS:对于性能,如果可行,您可以使用字符串数组而不是dna_codon[40]
或链接列表。每次比较的斩波/定位分隔符都是开销。
答案 1 :(得分:2)
虽然我不知道你想要什么样的输出。但是如果直接运行你的代码,我就会出现段故障。
gets()
。这是非常重要的。请改用fgets()。你可以写fgets(sequence, 1000, stdin)
。strtok
修改dna_codon
时与x无关。没有什么可以阻止strtok
从外面。如果要拆分dna_codon
而不想修改它,则应复制字符串。使用strcpy(char*,char*)
。这将是一个真正的副本(两个字符串)。如果您只是将字符串分配给另一个变量。它们只是指向相同字符串的两个指针。
char x [40]; 的strcpy(X,C 1 [k]的.dna_codon); //而不是x = dna_codon