我试图让用户输入一串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;
}
由于这是我的第一个问题,我担心可能难以表达。我也很尴尬我使用“免费”而不是补充。希望这种解释更清楚。
编辑:编辑的帖子更加清晰(希望如此)。
答案 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
执行相同操作。)