我想从同一项目中的另一个c程序中调用snmpget.c
。出于这个原因,我已将main()
更改为函数说get_func()
,它采用相同的参数。但我不知道如何提出论据argv[0]
我的论点看起来像这样:
char *argstr[]=
{
"v",
"1",
"c",
"public",
"-Ovq",
"192.168.1.1",
"ifInOctets.7",
"ifOutOctets.7",
NULL
};
然后
i = get_func(10, argstr);
1. argv[0]
应该是应用名称还是路径?
2.使用char *argstr[]
更正c?
3. snmpget
没有正确地接受这些论点。原因是什么?
它在命令中使用相同的args正常工作。
答案 0 :(得分:1)
是的,如果您main
使用它。如果没有,只需通过NULL
足够> o<
当然,它是指针的数组。 char *argstr[9]
等于
typedef char *pchar;
pchar argstr[9];
好吧,我假设你没有提供适当的argc
而且没有通过argv[0]
传递应用名称,因为argc
是10
,但是argv
的内容数量为8.(我已将其排除在NULL
之外,但NULL
尚未确定 - argv[argc]
应为NULL
。)
为了减少错误,我建议您使用sizeof(argstr) / sizeof(argstr[0]) - 1
而不是自己计算argc
。
见live example。代码:
#include <stdio.h>
int test(int argc, char *argv[]);
int main()
{
char *argstr[] = {
"test.exe",
"--opt-1",
"--output",
"test.txt",
NULL
};
int argcount = sizeof(argstr) / sizeof(argstr[0]) - 1;
return test(argcount, argstr);
}
int test(int argc, char *argv[])
{
int i;
printf("argc: %d\n", argc);
printf("program name: %s\n", argv[0]);
for (i = 1; argv[i] != NULL; i++)
{
printf("argument %d is: %s\n", i, argv[i]);
}
return 0;
}
输出:
argc: 4
program name: test.exe
argument 1 is: --opt-1
argument 2 is: --output
argument 3 is: test.txt
答案 1 :(得分:1)
get_func
期望参数从argv[1]
开始,因此您的argstr
参数不应以"v"
开头,而应使用其他内容(例如程序名称或仅为空如果get_func
不使用它,则为字符串。)是。但请注意,您的argstr
包含不可修改的字符串,如果get_func
想要修改它们,则可以使用复合文字
char *argstr[]= { (char []){ "v" }, (char []){ "1" }, /* etc */ NULL };
请参阅1.和2.此外,argc
不正确(必须为sizeof argstr/sizeof *argstr - 1
,在您的情况下为8,而不是10)。
不直接回答您的问题,但请考虑重新设计(取决于您目前正在做什么)。例如,编写一个接受存储不同选项(已经解析和验证)的结构的函数,并将旧的main
从 snmpget.c 更改为仅扫描和验证参数的函数,初始化这样的结构对象,并调用此函数。然后,或许将您的文件拆分为 snmpget.c , snmpget_main.c , another_c_file.c (当然还有更好的名称)和链接针对 snmpget.c 的目标文件的用户界面实现。