C语言命令行参数字符比较触发段错误问题求助
命令行选项处理的段错误排查与解决
问题场景
实现命令行选项比较功能,其中-f选项允许用户输入c或b,编写的C代码如下:
int main(int argc, char** argv){ char *i; char *o; char *f; int c; while ((c = getopt (argc, argv, "i:o:f")) != -1) switch (c) { case 'i': i = optarg; break; case 'o': o = optarg; break; case 'f': f = optarg; break; } if(strcmp(f, "b") == 0){ //execute code } }
运行程序时触发段错误:
Program received signal SIGSEGV, Segmentation fault. __strcmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:115 115 ../sysdeps/x86_64/multiarch/strcmp-avx2.S: No such file or directory.
执行命令(Linux系统):
gcc -g program.c program gdb --args ./program -f b
问题原因与修复方案
1. 核心问题:getopt选项格式错误
getopt的选项字符串中,f后面没有加冒号:,表示-f是不带参数的选项。当执行./program -f b时,getopt会把b当作独立的位置参数,而非-f的参数,导致f指针始终是未初始化的野指针,调用strcmp(f, "b")时访问非法内存,触发段错误。
2. 修复步骤
- 修正
getopt选项字符串:在f后添加冒号,表明-f需要接收参数:while ((c = getopt (argc, argv, "i:o:f:")) != -1) - 初始化指针并处理未传参情况:未初始化的指针若用户未传
-f选项,依然会导致崩溃,因此要给f初始化为NULL,并在比较前先检查:char *f = NULL; // 初始化指针 // ... 其他代码 ... if(f != NULL && strcmp(f, "b") == 0){ //execute code }
完整修复后的代码示例
#include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <string.h> int main(int argc, char** argv){ char *i = NULL; char *o = NULL; char *f = NULL; int c; while ((c = getopt (argc, argv, "i:o:f:")) != -1) switch (c) { case 'i': i = optarg; break; case 'o': o = optarg; break; case 'f': f = optarg; break; case '?': // 处理无效选项或缺少参数的情况 fprintf(stderr, "Invalid option or missing argument\n"); return EXIT_FAILURE; default: abort(); } if(f != NULL && strcmp(f, "b") == 0){ printf("Executing code for -f b\n"); //execute code } else if(f != NULL && strcmp(f, "c") == 0){ printf("Executing code for -f c\n"); //execute code for c } else if(f != NULL){ fprintf(stderr, "Invalid argument for -f: %s\n", f); return EXIT_FAILURE; } else { fprintf(stderr, "-f option is required\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }
验证修复
编译并执行:
gcc -g program.c -o program ./program -f b
此时程序会正常执行-f b对应的代码,不会触发段错误。
内容的提问来源于stack exchange,提问作者user2355903
相关产品推荐
相关产品推荐

