getopt()参数中的空格导致解析失败

时间:2015-08-20 15:06:59

标签: c

我正在使用optarg。即使我引用它,我输入的参数也会分成空格。

我的代码:

while ((c = getopt(argc, argv, "d:f:")) != -1)
    switch (c) {
        case 'd':
            dflag++;
            break;
        case 'f':
            fflag++;
            break;
        case '?':
            if (optopt == 'd' || optopt == 'f')
                fprintf(stderr, "Option -%c requires an argument.\n", optopt);
            else if (isprint(optopt))
                fprintf(stderr, "Unknown option `-%c'.\n", optopt);
            else
                fprintf(stderr,
                        "Unknown option character `\\x%x'.\n",
                        optopt);
            return 1;
        default:
            usage();
            return 1;
    }

if (fflag > 1 || dflag > 1 || fflag >= 1 && dflag >= 1) {
    fprintf(stderr, "Please choose one option only.");
    return 1;
}

for (index = optind; index < argc; index++) {
    printf("Non-option argument %s\n", argv[index]);
    usage();
}

printf("%s",optarg);

我这样运行:

a.exe -d "c:\Program Files\"

输出结果为:

C:\Program

这是我使用的getopt代码: https://github.com/seastorm/PuttyRider/blob/master/Wingetopt.c

1 个答案:

答案 0 :(得分:1)

问题出在你的论点上,而不是你的代码。命令行中的最后两个字符(\")会导致最后一个双引号被转义。因此,您的报价失败。

对我来说,如果我在反斜杠后面添加一个尾随空白字符,你的代码就可以了:

a.exe -d "c:\Program Files\ "

如果我在双引号前面转义反斜杠,它也可以工作:

a.exe -d "c:\Program Files\\"

我使用Visual Studio 2012在Windows 7上编译了代码。我在代码的开头添加了以下行,以便编译:

int c = 0;
int dflag = 0;
int fflag = 0;
int index = 0;