我正在尝试使用getopt来运行两个不同的函数,具体取决于给定的参数。
int main(int argc, char **argv) {
int i;
int identify;
while ((identify = getopt(argc, argv, "c:")) != -1) {
switch (identify) {
case 'c':
for (i = 2; i < argc; i++) {
readerC(argv[i]);
}
default:
for (i = 2; i < argc; i++) {
reader(argv[i]);
}
}
}
return(0);
}
目的是,如果命令包含“ -c”,则它将运行“ readerC”功能。如果没有传递任何参数,则它将读取“阅读器”功能。
我已经多次修改了上面的函数,但是在不带参数(没有输出)的情况下运行命令时,我似乎无法运行“阅读器”函数。以前,放入-c会根据需要运行readerC命令,但是在弄乱它之后,它现在先运行readerC函数,然后再运行reader函数。
我尝试将“ default:”更改为“ case':'”和“ case'?'”,但这都不起作用。任何帮助将不胜感激 :)
最佳答案
main()
程序处理选项的顺序通常是:
初始化
选项解析
做真正的工作
您应该使用getopt()
处理选项,然后处理文件参数。您还需要在break
语句中包含switch
,因为C在个案之间不会自动中断。
因此,您可能最终得到:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void reader(const char *file);
static void readerC(const char *file);
int main(int argc, char **argv)
{
void (*function)(const char *arg) = reader;
int opt;
while ((opt = getopt(argc, argv, "c")) != -1)
{
switch (opt)
{
case 'c':
function = readerC;
break;
default:
fprintf(stderr, "Unrecognized option %c\n", optopt);
exit(1);
}
}
if (optind == argc)
{
fprintf(stderr, "Usage: %s [-c] file ...\n", argv[0]);
exit(1);
}
for (int i = optind; i < argc; i++)
{
(*function)(argv[i]); // The old-fashioned way
// function(argv[i]); // The more modern way
}
return(0);
}
如果您还不满意函数指针,则可以改用标志:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void reader(const char *file);
static void readerC(const char *file);
int main(int argc, char **argv)
{
int cflag = 0;
int opt;
while ((opt = getopt(argc, argv, "c")) != -1)
{
switch (opt)
{
case 'c':
cflag = 1;
break;
default:
fprintf(stderr, "Unrecognized option %c\n", optopt);
exit(1);
}
}
if (optind == argc)
{
fprintf(stderr, "Usage: %s [-c] file ...\n", argv[0]);
exit(1);
}
for (int i = optind; i < argc; i++)
{
if (cflag)
readerC(argv[i]);
else
reader(argv[i]);
}
return(0);
}
关于c - 使用getopt一次触发所有情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35488349/