首页 > 解决方案 > 如何识别导致分段错误的原因

问题描述

我的代码的目标是接受 2 个命令行参数(包括程序名称),并根据给定的第二个命令行参数打印出如图所示的响应。如果命令行参数是一个整数,用户的输入被接受或“成功”,如果它是其他任何东西(例如一个字符串或多个命令行参数),它将是 Null 并且将显示错误消息。这是为熟悉的人准备的CS50凯撒

我的代码如下:

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

int main(int argc,string argv[])
{
 
    char *x = argv[1];
    if (argc == 2 && isdigit(x))
    {
        printf("Success\n");
    }
    else
    {
        printf("Usage: ./caesar key\n");
    }
    
}

代码可以编译,但我遇到了分段错误。我知道分段错误是程序试图访问为数组分配的内存之外的东西(如果我错了,请纠正我)但我确实指定了 argv[1]。

标签: cpointerssegmentation-faultcommand-line-argumentscs50

解决方案


isdigit接受作为参数的 an ,int其中包含作为无符号字符的字符代码。

不幸isdigit的是,它通常被实现为宏,并且以这样一种方式编写,即如果您传入错误类型的数据,您不会收到警告。您正在传递一个指向字符的指针,该字符不是单个字符。第一个命令行参数的第一个字符是x[0]. 但是,这必须转换为unsigned char.

因此这些都是错误的

  • isdigit(x)

  • isdigit(x[0])

您可以用来检查第一个参数的第一个字符是否为数字的方法是

isdigit((unsigned char)x[0]))

但最终你想要的不是检查这些是否是数字,而是将字符串转换为整数,看看是否发生错误 -使用strto(u)lforx并查看它是否成功;然后检查结果值的范围。


推荐阅读