[英]Scan arguments and determine what they are with a c++ program
首先,这是一项家庭作业。
我们必须创建一个“在UNIX / Linux中称为过滤器的通用应用程序编程模型”。
我坚持阅读作为参数传递的输入(这似乎是我遇到的所有麻烦)。
例如, cmd已打开并输入以下行:
program -isomebinaryfile.bin
我需要确定连字符( -
)后的第一个字母是什么,依此类推。
scanf
是我要用的吗? 我的main
对象设置为能够接受参数:
int main (int argc, char *argv[])
{
FILE *inf = NULL;
char *arg = argv[0];
}
有人可以给我一点帮助吗?
您需要使用getopt 。 手册页上有一个例子。
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);
}
除非您的任务只是处理参数,否则您可能要查找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)...
试一试所有的字符串函数。 您会发现它们对于所有以后的程序都是必不可少的。
从argv
获取参数(“参数矢量”)。 在您的示例中, argc
和argv
将如下所示:
argc == 2
argv[0] == "cmd"
argv[1] == "-isomebinaryfile.bin"
在argv[1]
找到连字符后的第一个字母是一个简单的循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.