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

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

我也试过

if(argc < 3)

但它也没有工作......同样的分段错误......

4

3 回答 3

8

为什么分段错误?

由于代码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    
    

    then argv[0] == ./exe, argv[1] == firstnameand argv[2] == lastname,argv[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;
}
于 2013-10-01T05:48:42.450 回答
0

首先,您应始终使用strcmp(some_string, "")而不是strcmp(some_string, NULL)检查字符串是否为空。

但是在你的问题中你应该测试

if (argc < 4)

那是因为可执行文件本身也在数组中argv。考虑您正在调用类似./a.out param0 param1, thenargc将是3and argv[0]="./a.out", argv[1]="param0", argv[2]="param1"

编辑:

另外,永远不要if(strcmp(argv[2], NULL) == 0)直接测试。始终argc先测试。由于没有受让人知道将存储什么argv[argc+n]价值n >= 0

于 2013-10-01T05:30:36.337 回答
0

你不能用strcmp()来比较NULL。两个参数都不能为空。在这种情况下,无论如何都没有意义。如果参数不存在,argc则 < 3,如果它为空,则长度为零。从不为空。

于 2013-10-01T05:08:30.210 回答