gpt4 book ai didi

c - strcmp() 的段错误

转载 作者:太空狗 更新时间:2023-10-29 15:58:30 26 4
gpt4 key购买 nike

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

我正在传递 3 个命令行参数,但我也想通过上述语句仅使用 2 个命令行参数来运行它。但是正在显示段错误。

我也试过

if(argc < 3)

但它也没有用...同样的段错误...

最佳答案

Why segmentation fault?

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

您应该使用 == 作为 if(argv[2] == NULL)

将字符串指针与 NULL 进行比较

I'm passing 3 command line arguments but I also want to run it with only 2 command line arguments with the above statement.

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

  1. 主要语法是:

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

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

    所以当你没有传递额外的参数时 argc == 1 例如./exe

    假设你传递三个参数如下:

    ./exe firstname lastname    

    然后argc == 3,看起来您正在传递两个参数,但包括可执行文件名称,您实际上是在将三个参数传递给进程。

    因此您可以使用 argc 值在循环中迭代以打印传递的参数(除了可执行文件)

     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 == 3(argv[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;
}

关于c - strcmp() 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19108368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com