这个问题在这里已有答案:
我正在尝试tom编写一个简单的程序,我接受命令行参数,将其转换为整数并将其打印到屏幕:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
int num = atoi(argv[1]);
printf("%s/n", num);
return 0;
}
编译并运行代码后,我收到了一个
segmentation fault (core dumped error)
我试图用输出打印输出,只是打印到屏幕上,它可以正常工作。问题似乎是我将char转换为int的方式。我哪里错了?
发布于 2019-03-12 09:16:41
int num = atoi(argv[1]); printf("%s/n", num);
替换格式"%d\n"
,目前您尝试将num写为字符串(%s
),因此打印尝试访问地址中的字符是num的值,该地址无效导致崩溃
或者当然假设你的程序至少得到一个参数,所以argc > 1并且至少argv[1]
不是NULL
根据备注的要求,更正和更安全的方法可以是:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
if (argc > 1) {
int num;
char c;
if (sscanf(argv[1], "%d%c", &num, &c) == 1)
printf("%d\n", num);
else
printf("'%s' does not (only) contain an int\n", argv[1]);
}
else
printf("an argument is required for '%s'\n", argv[0]);
return 0;
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra i.c
pi@raspberrypi:/tmp $ ./a.out
an argument is required for './a.out'
pi@raspberrypi:/tmp $ ./a.out 12
12
pi@raspberrypi:/tmp $ ./a.out a
'a' does not (only) contain an int
pi@raspberrypi:/tmp $ ./a.out 12a
'12a' does not (only) contain an int
我使用sscanf而不是atoi,因为如果参数不是有效整数,atoi返回0而不指示错误。
我让你看看添加两个char数组的值以获取更多细节,包括使用strtod
发布于 2019-03-12 09:37:30
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
if (argc < 2) {
printf("You must provide a command-line argument.\n");
return 1;
}
int num = atoi(argv[1]);
printf("%d\n", num);
return 0;
}
正如其他人所说,除非argc至少为2(表示在运行程序时必须至少提供一个命令行参数),否则不能在没有segfaulting的情况下访问argv [1]。问题可能是您通过不向程序提供命令行参数来取消引用空指针。
https://stackoverflow.com/questions/-100006428
复制相似问题