首页 文章

分段故障检查用户参数c

提问于
浏览
0

我正在尝试使用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 回答

  • 0

    这是不正确的,因为在C string 中不是内置类型(并且不是某些标准头中定义的标准类型 - 请注意C在其 <string> 标准头中定义了std::string) .

    main 的签名必须是

    int main(int argc, char**argv);
    

    惯例是 argv[argc] 是空指针,而 argv[0]argv[argc-1]argc 指针是指向以空字符结尾的字符串的非空指针 .

    请注意(至少在Linux和Posix系统上)程序参数不是程序的用户输入 . shell已被赋予命令行作为输入,并已将该命令行扩展为程序参数 . 您的程序稍后可以读取一些输入,例如与scanf .

    您无法使用 atoi 转换 NULL 指针,因此在进行转换之前应检查 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系统上)程序应该接受GNU coding standard--help 参数 . 我建议你使用getopt(特别是 getopt_long )或argp来解析程序参数 .

    最后,编译所有警告和调试信息(例如 gcc -Wall -g )和learn如何 use the debugger (例如 gdb ) .

  • 5

    你的主要应该是

    int main(int argc, char*argv[])
    

    在使用 atoi argv[1] 之前进行检查

    此外,所有路径都应返回一个值 . Bung return 0; 在最后

  • 3

    正如其他人所说,字符串不是基本类型 . 但是,由于您在一个案例中得到结果,您的分段错误与argv上的atoi有关.1 . c数组基于0,因此您尝试转换未初始化的内存 . 在atoi之前使用argc测试 .

相关问题