c中的互补DNA链

时间:2015-01-12 17:08:46

标签: c

我试图让用户输入一串DNA,然后 1.)让字符串反转, 2.)用其补码替换每个字符,即反转字符串,然后将'A'替换​​为'T',将'T'替换为'A',将'G'替换为'C',将'C'替换为'G'。到目前为止我所拥有的:

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


int main()
{
    int reverse(char[]);
    int replace(char[]);
    char s[1000];
    int c;
    int i;
    printf("Enter the String\n");
    scanf("%s",&s);
    reverse(s);
    replace(s);
}


int reverse(char s1[])
        {
int c,i,j;
    for(i=0,j=strlen(s1)-1;i<j;i++,j--) {
        c=s1[i],s1[i]=s1[j],s1[j]=c;
    }

    printf("The complementary string is:%s\n",s1);

    return 0;
}

int replace(char s[])
{

    int j = 0;

    while (s[j] != '\0')
    {
        if (s[j] == 'A')
        putchar('T');
    } 
    if (s[j] == 'T')
    {
        putchar('A');
    } 
    if (s[j] == 'G') 
    {
        putchar('C');
    } 
    if (s[j] == 'C')
    {
        putchar('G');

        } 
    else 
    {
            putchar('*');
        }
        j++;

    return 0;
}

由于这是我的第一个问题,我担心可能难以表达。我也很尴尬我使用“免费”而不是补充。希望这种解释更清楚。

编辑:编辑的帖子更加清晰(希望如此)。

1 个答案:

答案 0 :(得分:2)

您的代码中有几件事情发生了:

当您在%s中阅读scanf格式的字符串时,应传递char数组。由于此类数组在函数调用中“衰减”为指针,因此不应将其地址设为&

scanf("%s\n", s);

%s格式与标量(非数组)格式不同,您必须传递整数或浮点数的地址。)

你的replace函数有一个无限循环,因为while的右括号在你增加控制变量j之前就已经到了。如果您已正确格式化代码,这很容易发现。

看起来你选择打印字符串(而不是替换字符),因为

if (s[j] == 'A') s[j] = 'T';
if (s[j] == 'T') s[j] = 'A';

将A交换为T然后再返回。有很多方法可以解决这个问题。一个很好的解决方案是编写一个额外的函数来返回每个字母的补码:

int complement(int c)
{
    if (c == 'A') return 'T';
    if (c == 'T') return 'A';
    if (c == 'C') return 'G';
    if (c == 'G') return 'C';
    return '*';
}

这将使replace功能变得简单。

void replace(char s[])
{
    int j = 0;

    while (s[j]) {
        s[j] = complement(s[j]);
        j++;
    }
}

(我已经创建了该函数void,因为它没有返回任何有意义的内容。您可以对reverse执行相同操作。)