【问题标题】:'Segmentation fault' as user doesn't has an input“分段错误”,因为用户没有输入
【发布时间】: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 隐藏指针的不良做法。

标签: c cs50


【解决方案1】:

您在访问不存在的元素之后检查argv 的长度(argc。在你确定strlen(argv[1]) 之前,你不能这样做argv[1]

【讨论】:

    【解决方案2】:
    int n = strlen(argv[1]);
    

    如果没有命令行参数,它会调用未定义的行为。

    改为:

    size_t n = argc > 1 ? strlen(argv[1]) : 0;
    

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多