我正在尝试为我的软件包管理器添加选项(例如-a,-d,-i等),但无法更改大小写。如何根据通过的大小写更改大小写(即:Cree -a firefox)?
我一直在编写程序包管理器,现在正在尝试设置主c文件。在此文件中,我根据您通过的选项运行特定功能,例如,如果您要安装要运行的软件包creep -a <package>
,则将调用函数connection.c
和add.c
。我很难改变情况。主C文件(或Cree.c)当前包含以下内容:
#include <stdio.h>
#include "connection.c"
#include "add.c"
int main(int argc, char *argv[])
{
short i;
char option;
option = 'a';
switch(option) {
case 'a':
printf("a used\n");
connection();
break;
case 'd':
printf("d used\n");
break;
default:
printf("usage: creep [-ad]\n");
}
}
此刻,我只是使用print语句来确保一切正常。我仔细检查了一下进行调试,发现option = 'a'
始终处于运行状态,因此它将始终运行case 'a'
,但是我不知道如何进行更改。我确实尝试过option = argv[i]
,但是出现了以下错误:
creep.c:11:9: warning: incompatible pointer to integer conversion assigning to 'char' from 'char *'; dereference with * [-Wint-conversion]
option = argv[i];
^ ~~~~~~~
*
1 warning generated.
因此,我进行了一些搜索,发现了一个堆栈溢出帖子,内容涉及有关在某些情况下使用字符的情况,在这种情况下,告诫张贴者不要使用大小写,而是使用if / else。所以我确实尝试了这个,并得到了:
#include <stdio.h>
#include "connection.c"
#include "add.c"
int main(int argc, char *argv[])
{
short i;
for (i = 1; i < argc; i++) {
if (strncmp(argv[i], "-a", 100))
printf("using a\n");
}
}
但是,这也不起作用。然后,我决定看一些参考代码,看一下Plan9base ls,他们做选择的方式如下
void
main(int argc, char *argv[])
{
int i;
Binit(&bin, 1, OWRITE);
ARGBEGIN{
case 'F': Fflag++; break;
case 'd': dflag++; break;
case 'l': lflag++; break;
case 'm': mflag++; break;
case 'n': nflag++; break;
case 'p': pflag++; break;
case 'q': qflag++; break;
case 'Q': Qflag++; break;
case 'r': rflag++; break;
case 's': sflag++; break;
case 't': tflag++; break;
case 'u': uflag++; break;
default: fprint(2, "usage: ls [-dlmnpqrstuFQ] [file ...]\n");
exits("usage");
}ARGEND
但是,这似乎不适用于我的代码库。我将如何提供适当的选择?我似乎无法为我的一生解决这个问题。
答案 0 :(得分:1)
回答有关使用带程序参数的switch语句的主要问题:
我建议研究getopt(3)。手册页上有很好的文档和示例,该库易于使用,并且在* nix项目中具有广泛的用途。
要了解为什么字符串比较无法正常工作,请检查返回值。
要了解为什么不能将option
的值设置为argv[i]
,请记住char *var[]
的函数参数在功能上等效于char **var
,因此,您实质上是在尝试从char指针设置char。