1

DNA配列からタンパク質配列への変換に取り組んでいます。
私はすべてのプログラムを完了しましたが、構造上のエラーが1つだけ見つかりました。
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);
}

入力:

TAGTAG

出力:
の出力が表示された場合

printf("\n-----------%s & %s----------", string_3l, tmp_str );   

両方の反復で、構造で定義された値が減少することがわかりました。

構造がなぜそれを減らすのか、それとも私の間違いを減らすのか知りたいですか?私はここで立ち往生しているので

必要な出力:

StopStop
4

2 に答える 2

2

strtok()必要に応じてトークンを生成するために「区切り文字」を「\0」で上書きするため、文字列の重複コピーにのみ使用する必要があります。

以下のコードは文字列を切り刻みます:

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

例えば:

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

最初にstrtok()呼び出した後、「\ 0」は「、」を上書きします

String = "CTT"\0" CTC, CTA, CTG, TTA, TTG"文字列を切り刻む。読みやすくするために「\0」が追加されました。

文字列の残りの部分へのポインタを保持するのでstrtok()、最初のループは安全です。2番目のループ中の文字列は次のようになります。

String = "CTT"

dna_codon[40]PS:パフォーマンスのために、可能であれば、リンクリストの代わりに文字列の配列を使用できます。すべての比較で区切り文字を切り刻む/見つけるのはオーバーヘッドです。

IEEE Std 1003.1-2008 strtok()

于 2012-10-24T16:57:43.430 に答える
2

どんな出力が欲しいのかわかりませんが。しかし、コードを直接実行すると、セグメンテーション違反が発生します。

  1. 絶対に使用しないgets()でください。これは非常に重要です。代わりにfgets()を使用してください。あなたは書くことができますfgets(sequence, 1000, stdin)
  2. strtokを変更する場合、xとは何の関係もありませんdna_codon。外から止まることはできませんstrtok
  3. 分割dna_codonしたいが変更したくない場合は、文字列のコピーを作成する必要があります。を使用しstrcpy(char*,char*)ます。これにより、実際のコピーが作成されます(2つの文字列)。文字列を別の変数に割り当てるだけの場合。これらは、同じ文字列を指す2つのポインタです。

    char x [40]; strcpy(x、c1 [k] .dna_codon); // x=dna_codonの代わりに

于 2012-10-24T17:09:12.213 に答える