题目:DNA 序列还原。某生物学文件内容为多条长度不等 DNA 序列,为书写方便其中有些片段用小括
号括起并跟一个 int 数字,表示该片段需要重复多次。如“(AGG)3”表示“AGG”片段需要重
复 3 次,请按要求将源文件还原后写入新的文件中。注意:括号内的 DNA 片段长度不定长,重
复次数可能是个多位数。
但下面的代码运行后,在目标文件没输入内容。
#include
#include
#define _CRT_SECURE_NO_WARNINGS
int main()
{
FILE* fp1;
errno_t err1 = fopen_s(&fp1, "D://source.txt", "r"); /*以读的形式打开简写文件*/
if (fp1 == NULL)
{ /*打不开报错*/
printf("Erro 1!");
return 1;
}
char a[200];
char b[100];
fscanf_s(fp1, "%s", a); /*提取字符串*/
fclose(fp1);
FILE* fp2;
errno_t err2 = fopen_s(&fp2, "D://target.txt", "w"); /*以写的形式打开需要输入的文件*/
if (fp2 == NULL)
{
printf("Erro 2!"); /*打不开报错*/
return 2;
}
int i = 0, j = 0, k, l, m;
while (a[i] != '\0')
{ /*遍历所有元素*/
if (a[i] == '(')
{ /*判断左括号的出现*/
b[100] = { 0 };
i++;
while (a[i] != ')')
{ /*在遍历到有括号之前储存中间的所有元素*/
b[j] = a[i];
j++;
i++;
}
i++;
m = a[i] - 48; /*用ASC码形式获得重叠字符串需要循环的次数*/
for (l = 0; l < m; l++) {
for (k = 0; k < j; k++) {
fprintf(fp2, "%c", b[k]); /*循环输出*/
}
}
i++;
}
else {
}
fprintf(fp2, "%c", a[i]); /*其余元素正常输出*/
i++;
}
fclose(fp2); /*关闭写入文件*/
return 0;
}
在你的代码中,在 while 循环中没有处理输入字符串中没有括号的情况。因此,当遍历到没有括号的字符时,else 语句块中的内容不会执行,导致目标文件没有输入内容。
为了解决这个问题,可以在 else 语句块中添加对字符的输出,例如:
else {
fprintf(fp2, "%c", a[i]);
}
另外在你的代码中,使用了一个长度为 100 的字符数组 b 来储存括号内的字符串。然而在使用 b 时将数组全部赋值为 0,这会导致 b 中所有元素都被覆盖。可以将这一行代码删除,以便 b 中储存的是括号内的字符串。
望采纳