作为一个例子,我想实现以下功能: listtool [-s | -a NUM]<字符串>
我的方法如下:
int opt;
int opt_s = -1, opt_a = -1, num;
char *optstr ="<not yet set>";
num = -1;
if( argc < 3 || argc > 4 ) {
fprintf(stderr, "Wrong number of arguments");
usage();
}
/* Options */
while ((opt = getopt(argc, argv, "sa:")) != -1) {
switch (opt) {
case 's': {
if (opt_s != -1) {
fprintf(stderr, "opt_s multiple times\n");
usage(); /* does not return */
}
else if (opt_a != -1) {
fprintf(stderr, "Please only choose one option\n");
usage();
}
else {
++opt_s;
break;
}
}
case 'a': {
if (opt_a != -1) {
fprintf(stderr, "opt_a multiple times\n");
usage(); /* does not return */
}
else if (opt_s != -1) {
fprintf(stderr, "Please only choose one option\n");
usage();
}
++opt_a;
++num;
break;
}
case '?': {
usage();
break;
}
// Impossible
default: {
assert(0);
}
}
}
/* Arguments */
if( num > -1 ) {
if( (argc - optind) != 2 ) {
usage();
}
num = (int)strtol( argv[optind], NULL, 0 );
*optstr = argv[optind+1];
}
else {
if( (argc - optind) != 1 ) {
usage();
}
*optstr = argv[optind];
}
这段代码有一些不起作用的东西。我想知道为什么,以及正确的方法是什么。
将argv [optind]赋值给optstr throws:
warning: assignment makes integer from pointer without a cast
提前感谢您的每一个答案
答案 0 :(得分:1)
对第3个问题the assignment of argv[optind] to optstr throws: warning ?
的回答如下,
char *optstr;
*optstr = argv[optind]; // Wrong if LHS is a string rather a char
optstr = argv[optind]; // Correct one
这里,optstr
是一个指向字符的指针,可以存储单个字符或字符串。
此外*optstr
引用char
,RHS argv[optind]
是字符串引用指针。因此警告。