分段错误检查用户参数c

分段错误检查用户参数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

我试图用argc和argv验证来自命令行的用户输入,但遇到了分段错误,不确定原因

我想验证用户是否输入了正整数,因此argc=2,argv为正

这是我的密码:

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*。它可以重写。