我正在尝试使用argc和argv从命令行验证用户输入,但我遇到了分段错误,我不知道为什么 .
我想验证用户是否已输入正int(因此argc = 2且argv为正) .
这是我的代码:
int main (int argc, string argv[])
{
int k = atoi(argv[1]);
if (argc != 2 && k <1)
{
return 1;
}
}
我的代码中的k <1部分似乎工作正常,但每次尝试运行时都会出现分段错误而没有程序名和参数(agrc!= 2) .
编辑:
更清楚地描述错误处理问题:
如果我运行./myprogram -2然后我按预期得到我的返回1 .
如果我运行./myprogram hjdksfhdsk然后按预期得到我的返回1 .
如果我运行./myprogram,那么我会遇到分段错误 .
正是这种行为让我觉得我对argc值的处理是错误的,但我不确定为什么我不能只测试argc!= 2 .
3 回答
这是不正确的,因为在C
string
中不是内置类型(并且不是某些标准头中定义的标准类型 - 请注意C在其<string>
标准头中定义了std::string) .main
的签名必须是惯例是
argv[argc]
是空指针,而argv[0]
到argv[argc-1]
的argc
指针是指向以空字符结尾的字符串的非空指针 .请注意(至少在Linux和Posix系统上)程序参数不是程序的用户输入 . shell已被赋予命令行作为输入,并已将该命令行扩展为程序参数 . 您的程序稍后可以读取一些输入,例如与scanf .
您无法使用
atoi
转换NULL
指针,因此在进行转换之前应检查argc
.顺便说一下,我相信(至少在Linux或Posix系统上)程序应该接受GNU coding standard的
--help
参数 . 我建议你使用getopt(特别是getopt_long
)或argp来解析程序参数 .最后,编译所有警告和调试信息(例如
gcc -Wall -g
)和learn如何 use the debugger (例如gdb
) .你的主要应该是
在使用
atoi
argv[1]
之前进行检查此外,所有路径都应返回一个值 . Bung
return 0;
在最后正如其他人所说,字符串不是基本类型 . 但是,由于您在一个案例中得到结果,您的分段错误与argv上的atoi有关.1 . c数组基于0,因此您尝试转换未初始化的内存 . 在atoi之前使用argc测试 .