if(strcmp(argv[2], NULL) == 0)
我传递了 3 个命令行参数,但我也想通过上述语句仅使用 2 个命令行参数来运行它。但正在显示分段错误错误。
我也尝试过
if(argc < 3)
但它也不起作用...同样的分段错误...
为什么分段错误?
因为代码if(strcmp(argv[2], NULL) == 0)
,您将 NULL 作为字符串指针传递给strcmp()
功能;尝试在 NULL 处取消引用来比较字符代码(例如 ascii 代码),这会导致运行时出现未定义的行为。
您应该使用以下命令将字符串指针与 NULL 进行比较==
as if(argv[2] == NULL)
我传递了 3 个命令行参数,但我也想通过上述语句仅使用 2 个命令行参数来运行它。
您可以通过两种方式实现此目的:
-
主要语法是:
int main(int argc, char* argv[])
第一个论点argc
参数计数器是传递给进程的参数总数,包括进程名称。
所以当你没有传递额外的参数时argc == 1
e.g. ./exe
假设您传递三个参数,如下所示:
./exe firstname lastname
Then argc == 3
,
看起来您正在传递两个参数,但包括可执行文件名称,您实际上正在传递三个参数来处理。
所以你可以使用argc
在循环中迭代以打印传递的参数的值(除可执行文件外)
printf("Process name is: %s", argv[0]);
for(i = 1; i < argc; i++ ){
printf("argv[%d] %s\n", argv[i]);
}
-
第二种技术是使用第二个参数:argv[]
是 NULL 终止的字符串数组,所以argv[argc]
始终等于 NULL。您可以在循环中使用此信息来迭代和处理传递的参数。
要理解这一点,假设您正在执行以下函数:
./exe firstname lastname
then argv[0] == ./exe
, argv[1] == firstname
and argv[2] == lastname
and argv[3] == NULL
,这次注意argc == 3
(argv[argc]
means argv[3]
== 空)。
例如,要打印所有参数,您可以编写如下代码:
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)