【发布时间】:2021-12-28 00:21:33
【问题描述】:
我想实现一个程序,将用户的 DNA 字符串更改为 RNA 字符串。但是我的代码有一些我不太理解的问题。我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
int n = strlen(argv[1]);
if (argc != 2)
{
printf("Usage: ./rna ATGC\n");
return 1;
}
else if (argc == 2 && n >= 4)
{
for (int i = 0; i < n; i++)
{
if (argv[1][i] == 'A' || argv[1][i] == 'a')
{
printf("U");
}
else if (argv[1][i] == 'G' || argv[1][i] == 'g')
{
printf("C");
}
else if (argv[1][i] == 'C' || argv[1][i] == 'c')
{
printf("G");
}
else if (argv[1][i] == 'T' || argv[1][i] == 't')
{
printf("A");
}
}
return 0;
}
if (n <= 3)
{
printf("Invalid DNA\n");
}
}
如果用户只是运行程序,我想得到这样的输出:
$ ./rna
Usage: ./rna ATGC
但是,我明白了,但无法真正找出问题所在。
$ ./rna
Segmentation fault
【问题讨论】:
-
如果没有传递参数,那么
argv[1]是一个 NULL 指针,你的第一行是strlen(NULL)这是未定义的行为(在这种情况下是段错误)。您应该将n=strlen(argv[1])移动到argc == 2块内。 -
顺便说一句,你所有的
if (argv[1][i] == 'A' ...)在一个返回互补字符的函数中会更整洁,而是使用switch。 -
string是非标准的。请使用cs50标记您的帖子,这样我们就不必看到使用 typedef 隐藏指针的不良做法。