c - 如何识别导致分段错误的原因
问题描述
我的代码的目标是接受 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]。
解决方案
isdigit
接受作为参数的 an ,int
其中包含作为无符号字符的字符代码。
不幸isdigit
的是,它通常被实现为宏,并且以这样一种方式编写,即如果您传入错误类型的数据,您不会收到警告。您正在传递一个指向字符的指针,该字符不是单个字符。第一个命令行参数的第一个字符是x[0]
. 但是,这必须转换为unsigned char
.
因此这些都是错误的
isdigit(x)
isdigit(x[0])
您可以用来检查第一个参数的第一个字符是否为数字的方法是
isdigit((unsigned char)x[0]))
但最终你想要的不是检查这些是否是数字,而是将字符串转换为整数,看看是否发生错误 -使用strto(u)l
forx
并查看它是否成功;然后检查结果值的范围。
推荐阅读
- swift - 当用户启用 VoiceOver 时选择 UITextField 中的所有文本
- java - java Arraylist是一种组合形式吗
- python - 尝试并排除练习问题出现错误的麻烦
- python - 如何在本地计算机上安装 apache beam SDK for python
- firebase - 如何在应用程序打开(前台)、触发 OnMessage 时显示推送通知?
- javascript - 如何在猫鼬的数组中推送子文档?
- r - 双向量的值匹配
- c# - Postman 问题 JSON 值无法转换为 agsamplewebapi.Model.Employee
- c++ - 将前一个节点的地址存储到当前节点的“prev”部分
- r - 使用 dplyr 和 NSE 动态构造具有不同参数的函数调用