strcmp()的分段错误

an56k
if(strcmp(argv[2], NULL) == 0)

我传递了3个命令行参数,但我也想在上面的语句中仅使用2个命令行参数来运行它。但是显示了分段错误错误。

我也尝试过

if(argc < 3)

但是它也没有用...相同的细分错误...

Grijesh Chauhan

为什么会细分错误?

由于代码的原因if(strcmp(argv[2], NULL) == 0),您正在将NULL作为字符串指针传递给strcmp()函数;尝试参考NULL比较字符代码(例如acsii代码),这会在运行时导致未定义的行为。

您应该使用==as将字符串指针与NULL进行比较if(argv[2] == NULL)

我传递了3个命令行参数,但我也想在上面的语句中仅使用2个命令行参数来运行它。

您可以通过两种方式实现此目的:

  1. 主要语法为:

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

    第一个参数argc是参数计数器,它是传递给您的进程的参数总数,包括进程名称。

    因此,当您不传递任何额外参数时,argc == 1例如./exe

    假设您传递三个参数,如下所示:

    ./exe firstname lastname    
    

    然后argc == 3,看起来您要传递两个参数,但是实际上您要传递三个参数来处理,包括可执行文件名。

    因此,您可以使用argcvalue在循环中进行迭代以打印传递的参数(其他参数然后是可执行文件)

     printf("Process name is: %s", argv[0]);
     for(i = 1; i < argc; i++ ){
          printf("argv[%d] %s\n", argv[i]);
     }
    
  2. 第二种技术是使用第二个参数:argv[]是以NULL结尾的字符串字符串数组,因此argv[argc]始终等于NULL。您可以在循环中使用此信息来迭代和处理所传递的参数。

    为了理解这一点,假设您正在以以下方式执行函数:

    ./exe firstname lastname    
    

    然后argv[0] == ./exeargv[1] == firstnameargv[2] == lastnameargv[3] == NULL,请注意这次argc == 3argv[argc]表示argv[3]== NULL)。

    例如,要打印所有参数,可以编写如下代码:

      int i = 1;
      printf("Process name is: %s", argv[0]);
      while(argv[i]){// terminates when argv[i] == NULL
        printf("argv[%d] %s\n", argv[i]);   
        i++;
      }
    

您是否注意到argv[0]始终是您的可执行文件名称!这意味着在argv[0]编写代码时,每当需要打印可执行文件名称时,请使用而不是可执行文件的硬代码名称,这样,如果重新编译并为可执行文件赋予新名称,则argv[0]始终会打印正确的名称。您应该编写如下代码:

int main(int argc, char* argv[]){
  :
  :// some other code
  if(argc < min_number_of_arguments){
      fprintf(stderr, "Error: wrong number of arguments passed!\n");
      fprintf(stderr, "Usage: %s [first] [second] \n", argv[0]);
      exit(EXIT_FAILURE);
  }
  :
  :// some other code 
   return EXIT_SUCCESS;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章