if(strcmp(argv[2], NULL) == 0)
我传递了3个命令行参数,但我也想在上面的语句中仅使用2个命令行参数来运行它。但是显示了分段错误错误。
我也尝试过
if(argc < 3)
但是它也没有用...相同的细分错误...
为什么会细分错误?
由于代码的原因if(strcmp(argv[2], NULL) == 0)
,您正在将NULL作为字符串指针传递给strcmp()
函数;尝试参考NULL比较字符代码(例如acsii代码),这会在运行时导致未定义的行为。
您应该使用==
as将字符串指针与NULL进行比较if(argv[2] == NULL)
我传递了3个命令行参数,但我也想在上面的语句中仅使用2个命令行参数来运行它。
您可以通过两种方式实现此目的:
主要语法为:
int main(int argc, char* argv[])
第一个参数argc
是参数计数器,它是传递给您的进程的参数总数,包括进程名称。
因此,当您不传递任何额外参数时,argc == 1
例如./exe
假设您传递三个参数,如下所示:
./exe firstname lastname
然后argc == 3
,看起来您要传递两个参数,但是实际上您要传递三个参数来处理,包括可执行文件名。
因此,您可以使用argc
value在循环中进行迭代以打印传递的参数(其他参数然后是可执行文件)
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
然后argv[0] == ./exe
,argv[1] == firstname
和argv[2] == lastname
和argv[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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句