0

这是一项家庭作业。

我们必须创建一个“在 UNIX/Linux 中称为过滤器的通用应用程序编程模型”。

我一直在阅读作为参数传递的输入(这就是我似乎遇到的所有问题)。

例如打开cmd,输入以下行:

program -isomebinaryfile.bin

我需要确定连字符 ( -) 之后的第一个字母是什么,依此类推。

scanf会用什么?Mymain设置为能够接受参数:

int main (int argc, char *argv[])
{
FILE *inf = NULL;
char *arg = argv[0];
}

有人可以给我一点帮助吗?

4

4 回答 4

1

您需要使用getopt。手册页有一个例子。

于 2013-02-14T15:32:39.730 回答
1

argv是一个字符串数组。你可以像循环一样遍历它们

for (int i=1; i<argc; i++) { // skip argv[0] as that's this program's name
    const char* arg = argv[i];
}

获得特定参数的字符串后,您可以使用来自的字符串操作函数<string.h>

if (arg[0] == '-' && strlen(arg) > 0) {
    arg++; // advance past the leading '-'
    if (strcmp(arg, "command_one") == 0) {
        // handle command_one
    }
    else if (strcmp(arg, "command_one") == 0) {
        ....
    else {
        printf("Error: unexpected command %s\n", arg);
    }
于 2013-02-14T15:33:26.610 回答
1

除非您的任务只是处理参数的处理,否则您可能需要查找getopt- 它是参数的标准库解析器。

至于您的问题的实质,有很多选择,您可以将sscanf其用作其中的一部分,但您不必这样做。

要解析您提到的一个参数,您需要执行以下操作:检查参数是否以 -i 开头,从参数中获取数据。

检查参数是否以 -i 开头的最简单方法是:

if (argv[1][0] == '-' && argv[1][1] == 'i')

或者,如果你有很多参数选项,都以'-'开头,你可能想要这样的东西:

char * i = NULL;
char * o = NULL;
char * s = NULL;
for (int i = 1; i < argc; ++i) {
    if (argv[i][0] == '-') {
        switch(argv[i][1]) {
            case 'i':
                i = argv[i][2];
                break;
            case 's':
                s = argv[i][2];
                break;
            case 'o':
                o = argv[i][2];
                break;
            default:
                cerr << "Unknown option: " << argv[i][1];
        }
     } else {
        cerr << "Error: all options must begin with '-'";
     }

请注意,我使用的是 argv[ 1 ],而不是 0。argv[0] 始终是可执行文件的名称。

提取其余参数的最快方法是简单的指针运算:

char * filename = argv[1] + 2;  // (Or you could equivalently say = &argv[1][2]

这是最有效的——它重用了 argv 中已经存在的字符串。如果您打算更改字符串,最好使用 strcpy:

char * filename = (char *)malloc(strlen(argv[1]) - 2);
strcpy(filename, argv1 + 2);
// and eventually you'd have to free(filename)...

玩转所有字符串函数并进行试验。您会发现它们对您以后的所有程序都是必不可少的。

于 2013-02-14T15:41:08.700 回答
0

argv(“参数向量”)获取参数。在您的示例中,argcargv如下所示:

argc == 2
argv[0] == "cmd"
argv[1] == "-isomebinaryfile.bin"

查找连字符后的第一个字母argv[1]是一个简单的循环。

于 2013-02-14T15:32:33.290 回答