gpt4 book ai didi

c - C 中的 getopt() 在 if 语句后无法正常工作

转载 作者:行者123 更新时间:2023-12-04 08:06:46 25 4
gpt4 key购买 nike

我想执行 Linux head 命令的副本。如果用户输入 ./cprogram head -(option here) 我希望出现该选项,但由于某种原因我的代码从未输入选项 switch 语句。例如,命令行代码 ./cprogram head -n 永远不会进入 case 'n': 语句。该代码在 if 语句之前运行,以检查 argv[1] 是否为 “head”

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {
int b;
int c;
int nflag = 0;
int Vflag = 0;
int hflag = 0;
int eflag = 0;
int oflag = 0;
char str[] = "head";
if (strcmp(argv[1], str) == 0) {
while ((c = getopt(argc, argv, "nVheo")) != -1) {
switch (c) {
case 'n':
if (nflag||Vflag||hflag||eflag||oflag) {
printf("only one option\n");
exit(1);
} else {
nflag++;
printf("n option\n");
}
break;
case 'V':
if (nflag||Vflag||hflag||eflag||oflag) {
printf("only one option\n");
exit(1);
} else {
Vflag++;
}
break;
case 'h':
if (nflag||Vflag||hflag||eflag||oflag) {
printf("only one option\n");
exit(1);
} else {
hflag++;
}
break;
case 'e':
if (nflag||Vflag||hflag||eflag||oflag) {
printf("only one option\n");
exit(1);
} else {
eflag++;
}
break;
case 'o':
if (nflag||Vflag||hflag||eflag||oflag) {
printf("only one option\n");
exit(1);
} else {
oflag++;
}
break;
default:
printf("invalid options\n");
abort();
}
}
} else {
}
}

我将非常感谢专家的眼睛来查看并发现我缺少的东西。提前致谢。

最佳答案

要使 getopt() 跳过 argv[1] 并从下一个元素解析选项,您应该在调用 之前设置 optind >getopt():

optind = 2;

另请注意,在将 argv[1]“head” 进行比较之前,您还应该检查是否 argc > 1

修改后的版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv) {
int b;
int c;
int nflag = 0;
int Vflag = 0;
int hflag = 0;
int eflag = 0;
int oflag = 0;
char str[] = "head";

if (argc > 1 && strcmp(argv[1], str) == 0) {
optind = 2; // skip argv[1]
while ((c = getopt(argc, argv, "nVheo")) != -1) {
if (nflag | Vflag | hflag | eflag | oflag) {
fprintf(stderr, "only one option\n");
exit(1);
}
switch (c) {
case 'n':
nflag++;
printf("n option\n");
break;
case 'V':
Vflag++;
break;
case 'h':
hflag++;
break;
case 'e':
eflag++;
break;
case 'o':
oflag++;
break;
default:
fprintf(stderr, "invalid option `%c'\n", c);
abort();
}
}
/* perform head on files starting at argv[optind] */
} else {
/* test some other command */
}
}

关于c - C 中的 getopt() 在 if 语句后无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66189408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com