我要做的是接受命令行参数并根据参数更改一些变量。我附加了一大块代码,因为整个代码大约是400行。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char somestring[500];
int ca=0;
if (argc==1) //if no arguments are specified use defaults
{
}
else
{
while(ca<argc)
{
ca++
if(strcmp(argv[ca],"-f")==0)
{
printf("This works");
ca++;
if(strcmp(argv[ca],"red")==0){
printf("this will print red\n");
}
else{
printf("invalid color");
}
}
if(strcmp(argv[ca),"")==0)
{
printf("invalid argument");
}
else {
strcat(somestring,argv[ca]);
}
}
printf("%s",somestring);
}
}
如果用户输入:
./ foobar -f red这是一个字符串
程序应打印:
&#34;这将打印红色,这是一个字符串&#34;
如果用户输入:
./ foobar -f red
程序应该打印&#34;无效的命令行参数数量&#34;。
最简单的方法是什么?我已经尝试了很多可能性而没有运气。 不同参数的数量对我来说是主要的问题(我也有超过5个选项,例如..- f -b -h -w -e)
帮助非常感谢。如果你愿意,我可以添加我的整个代码。
答案 0 :(得分:5)
通过此链接,您将找到有关如何轻松执行完整支持命令行参数的说明:
答案 1 :(得分:1)
char somestring[500]="";//need initialize
while(++ca<argc){//increment before condition test
if(strcmp(argv[ca],"-f")==0){
if(ca < argc && strcmp(argv[ca],"red")==0){//need ca check
if(ca == argc){//bad strcmp(argv[ca],"")
printf("invalid argument");
答案 2 :(得分:1)
正确的方法是使用众多现有解析器库中的一个而不是手动解析自己。它更容易,更强大,并为您省去重新发明轮子的麻烦。
GNU libc
手册建议了一些库,具体取决于你想要的花式/标准:
http://www.gnu.org/software/libc/manual/html_node/Parsing-Program-Arguments.html
getopt
:正如另一个回答所述argp
:我通常的选择suboptions
:适用于复杂的解决方案答案 3 :(得分:0)
将int ca = 0更改为int ca = 1
因为argv [0]是可执行文件的名称
答案 4 :(得分:0)
如果使用for-loop而不是愚蠢的“else while”构造,事情会变得更加清晰:
for(ca=1; ca < argc ; ca++)
{
if(!strcmp(argv[ca],"-f"))
{
printf("This works");
ca++; /* need to test if ca can be incremented */
if(!strcmp(argv[ca],"red")){
printf("this will print red\n");
}
else{
printf("invalid color");
}
}
else if(!strcmp(argv[ca],""))
{
printf("invalid argument");
}
else{
strcat(somestring,argv[ca]);
}
}
printf("%s",somestring);