在 C 中使用 getopt() 和 switch 语句
Using getopt() and switch statements in C
我是 C 的新手,正在尝试将 getopt 与 switch 语句结合使用。我认为我的问题只是语法问题,但我似乎无法弄清楚。我需要 运行 我的程序是这样的:
$/webserver -p 8080 -r /my/root/dir
。
所以我需要识别 -p 并获取 8080,识别 -r 并获取 /my/root/dir。目前我的代码找到 -p,然后找到 -r,然后检测到未知选项并退出。这是代码。我有 puts()
用于测试。
#define USAGE_STRING "Usage: webserver -p <port> -r <rootdir>\n"
char *port;
char *rootdir;
// Process command line arguments. Uses GNU getopt() function.
void processargs(int argc, char **argv) {
int next_option;
do {
next_option = getopt(argc, argv, "pr:");
if (next_option != -1) {
switch (next_option)
{
case 'p': /* -p -- port option */
puts("p");
port = optarg;
printf("%s", port);
case 'r': // -r -- root directory option
puts("r");
rootdir = optarg;
printf("%s", rootdir);
default:
puts("unknown");
/* Unknown option detected. Print it to standard
output, and exit with exit code zero (normal termination). */
fprintf(stderr, USAGE_STRING);
exit(1);
}
}
} while (next_option != -1);
printf("%s", port);
if (port == NULL) {
fprintf(stderr, USAGE_STRING);
exit(1);
}
if (rootdir == NULL) {
puts("unknown");
fprintf(stderr, USAGE_STRING);
exit(1);
}
}
当前,当我 运行 上面的命令时,我得到了这个输出(使用 puts 进行测试)。
p
r
unknown
Usage: webserver -p <port> -r <rootdir>
感谢您的帮助!
我相信您想在每个案例的末尾使用 break
,否则执行将进入下一个案例块。
一个C switch 语句需要在每个case 的末尾有一个break
,否则会执行下面case 中的代码。所以这个:
switch (next_option)
{
case 'p': /* -p -- port option */
puts("p");
port = optarg;
printf("%s", port);
case 'r': // -r -- root directory option
puts("r");
rootdir = optarg;
printf("%s", rootdir);
default:
puts("unknown");
/* Unknown option detected. Print it to standard output, and exit with exit code zero
(normal termination). */
fprintf(stderr, USAGE_STRING);
exit(1);
}
必须改成这样:
switch (next_option)
{
case 'p': /* -p -- port option */
puts("p");
port = optarg;
printf("%s", port);
break;
case 'r': // -r -- root directory option
puts("r");
rootdir = optarg;
printf("%s", rootdir);
break;
default:
puts("unknown");
/* Unknown option detected. Print it to standard output, and exit with exit code zero
(normal termination). */
fprintf(stderr, USAGE_STRING);
exit(1);
}
首先你应该使用 getopt_long()
我相信 getopt()
已经贬值了。您的 switch 语句中也缺少 break
。如果没有 break ,那么下面的每个案例都将被执行。虽然您可以使用 do-while 循环,但仅使用 while 循环更简单。
这是您可以构建的简单命令行解析器。
static const char *optstring = "p:r:";
static struct option longopts[] =
{
{ "port", required_argument, NULL, 'p' },
{ "root", required_argument, NULL, 'r' },
{ NULL, 0, NULL, 0 }
};
int parseInput(int argc, char * const argv[])
{
int ch;
/* Main Loop ie the Parser */
while ((ch = getopt_long(argc, argv, optstring, longopts, NULL)) != -1)
{
switch(ch)
{
case 'p':
printf("arg: %s\n", optarg);
break;
case 'r':
printf("arg: %s\n", optarg);
break;
default:
printf("Unsupported option\n");
return -1;
}
}
return 0;
}
我是 C 的新手,正在尝试将 getopt 与 switch 语句结合使用。我认为我的问题只是语法问题,但我似乎无法弄清楚。我需要 运行 我的程序是这样的:
$/webserver -p 8080 -r /my/root/dir
。
所以我需要识别 -p 并获取 8080,识别 -r 并获取 /my/root/dir。目前我的代码找到 -p,然后找到 -r,然后检测到未知选项并退出。这是代码。我有 puts()
用于测试。
#define USAGE_STRING "Usage: webserver -p <port> -r <rootdir>\n"
char *port;
char *rootdir;
// Process command line arguments. Uses GNU getopt() function.
void processargs(int argc, char **argv) {
int next_option;
do {
next_option = getopt(argc, argv, "pr:");
if (next_option != -1) {
switch (next_option)
{
case 'p': /* -p -- port option */
puts("p");
port = optarg;
printf("%s", port);
case 'r': // -r -- root directory option
puts("r");
rootdir = optarg;
printf("%s", rootdir);
default:
puts("unknown");
/* Unknown option detected. Print it to standard
output, and exit with exit code zero (normal termination). */
fprintf(stderr, USAGE_STRING);
exit(1);
}
}
} while (next_option != -1);
printf("%s", port);
if (port == NULL) {
fprintf(stderr, USAGE_STRING);
exit(1);
}
if (rootdir == NULL) {
puts("unknown");
fprintf(stderr, USAGE_STRING);
exit(1);
}
}
当前,当我 运行 上面的命令时,我得到了这个输出(使用 puts 进行测试)。
p
r
unknown
Usage: webserver -p <port> -r <rootdir>
感谢您的帮助!
我相信您想在每个案例的末尾使用 break
,否则执行将进入下一个案例块。
一个C switch 语句需要在每个case 的末尾有一个break
,否则会执行下面case 中的代码。所以这个:
switch (next_option)
{
case 'p': /* -p -- port option */
puts("p");
port = optarg;
printf("%s", port);
case 'r': // -r -- root directory option
puts("r");
rootdir = optarg;
printf("%s", rootdir);
default:
puts("unknown");
/* Unknown option detected. Print it to standard output, and exit with exit code zero
(normal termination). */
fprintf(stderr, USAGE_STRING);
exit(1);
}
必须改成这样:
switch (next_option)
{
case 'p': /* -p -- port option */
puts("p");
port = optarg;
printf("%s", port);
break;
case 'r': // -r -- root directory option
puts("r");
rootdir = optarg;
printf("%s", rootdir);
break;
default:
puts("unknown");
/* Unknown option detected. Print it to standard output, and exit with exit code zero
(normal termination). */
fprintf(stderr, USAGE_STRING);
exit(1);
}
首先你应该使用 getopt_long()
我相信 getopt()
已经贬值了。您的 switch 语句中也缺少 break
。如果没有 break ,那么下面的每个案例都将被执行。虽然您可以使用 do-while 循环,但仅使用 while 循环更简单。
这是您可以构建的简单命令行解析器。
static const char *optstring = "p:r:";
static struct option longopts[] =
{
{ "port", required_argument, NULL, 'p' },
{ "root", required_argument, NULL, 'r' },
{ NULL, 0, NULL, 0 }
};
int parseInput(int argc, char * const argv[])
{
int ch;
/* Main Loop ie the Parser */
while ((ch = getopt_long(argc, argv, optstring, longopts, NULL)) != -1)
{
switch(ch)
{
case 'p':
printf("arg: %s\n", optarg);
break;
case 'r':
printf("arg: %s\n", optarg);
break;
default:
printf("Unsupported option\n");
return -1;
}
}
return 0;
}