分段错误检查用户参数c
我试图用argc和argv验证来自命令行的用户输入,但遇到了分段错误,不确定原因 我想验证用户是否输入了正整数,因此argc=2,argv为正 这是我的密码:分段错误检查用户参数c,c,C,我试图用argc和argv验证来自命令行的用户输入,但遇到了分段错误,不确定原因 我想验证用户是否输入了正整数,因此argc=2,argv为正 这是我的密码: int main (int argc, string argv[]) { int k = atoi(argv[1]); if (argc != 2 && k <1) { return 1; } } 代码的k
int main (int argc, string argv[])
{
int k = atoi(argv[1]);
if (argc != 2 && k <1)
{
return 1;
}
}
代码的k<1部分似乎工作正常,但每次在没有程序名和参数agrc的情况下运行时,都会出现分段错误=二,
编辑:
更清晰地描述错误处理问题:
如果我运行./myprogram-2
然后我得到了预期的回报1
如果我运行./myprogram hjdksfhdsk
然后我得到了预期的回报1
如果我运行./myprogram
然后我得到一个分割错误
正是这种行为使我认为我对argc值的处理有问题,但我不确定为什么不能直接测试argc=2.你的主要目标应该是
int main(int argc, char*argv[])
并在argv[1]上的atoi上使用之前进行检查
此外,所有路径都应返回一个值。Bung返回0;最后, 这是错误的,因为在C字符串中不是内置类型,不是标准的头文件中定义的标准类型,注意C++在其标准头中定义了。 main的签名必须是
int main(int argc, char**argv);
约定是argv[argc]是空指针,从argv[0]到argv[argc-1]的argc指针是指向以空结尾的字符串的非空指针
请注意,至少在Linux和Posix系统上,程序参数不是程序的用户输入。shell被赋予了一个命令行作为输入,并将该命令行扩展为程序参数。您的程序稍后可以读取一些输入,例如使用scanf
不能使用atoi转换空指针,因此在进行转换之前应检查argc
int main(int argc, char**argv) {
if (argc!=2) {
fprintf(stderr, "%s needs two arguments\n", argv[0]);
exit(EXIT_FAILURE);
};
int k = atoi(argv[1]);
if (k<=0) {
fprintf(stderr,
"%s wants a positive first argument, but got %s\n",
argv[1]);
exit(EXIT_FAILURE);
}
// now do the real thing
}
顺便说一句,我相信至少在Linux或Posix系统上,程序应该接受每个参数的-help参数。我建议您使用getopt_long或来解析程序参数
最后,使用所有警告和调试信息进行编译,例如使用gcc-Wall-g以及如何使用调试器,例如gdb。正如其他人所指出的,字符串不是基本类型。然而,由于您在一个案例中得到了结果,所以您的分段错误与argv1上的atoi有关。在c中,数组是基于0的,所以您试图转换未初始化的内存。在atoi之前使用argc测试。应为int main int argc,char*argv[]main的第二个参数为const char*:非字符串。字符串不是C中的基本类型。您还存在一个逻辑错误-如果没有参数,atoi将失败。这甚至可以编译吗?谢谢大家,编辑成char*argv[],但我仍然有分段错误。我认为这个问题似乎与我处理argc有关,而不是字符串argv;因为OP正面临运行时错误,而不是编译时错误。@cup它不是const char*。它可以重写。