You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:10:32