запутался об этом использовании argv

int
main(int argc,char **argv){

for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount) {
argCount = 1;
switch (argv[0][1]) {
case 'q':
testnum = atoi(argv[1]);
argCount++;
break;
default:
testnum = 1;
break;
}
}
//...............

мой вопрос: что означает argv [0] [1] и условие for () сбило меня с толку, я имею в виду for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount)

// спасибо, ребята …. ** argv [0] [1] должен быть argv [0] [1], это моя ошибка, а не авторы кода.

4

Решение

argv[0] представляет имя программы в том виде, в каком оно было вызвано в командной строке. Если вы набрали ./myprogram --help, затем argv[0] будет «./myprogram».

argv[0][1] будет вторым символом этой строки, ‘/’ в примере выше.


Давайте посмотрим, что for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount):

Инициализирует цикл, выполнив argc-- затем argv++ (argv теперь указывает на строку второго параметра пользователя), а argc объявляет аргумент меньше.

Цикл для всех аргументов argc>0и на каждой итерации число обработанных аргументов argCount снимается количество всех аргументов argc, В этом есть смысл.

тем не мение switch (**argv[0][1]) не имеет никакого смысла, argv[0][1] это charКак видно ранее, не указатель, поэтому он не может быть разыменован.

1

Другие решения

Этот код не выглядит правильно. **argv[0][1] пытается разыменовать char,

argv[0][1] будет иметь смысл, а значит «взять второй char из первых char* в argvMsgstr «ИМХО, код пытается обнаружить -q флаг командной строки (и впоследствии установка testnum к int версия следующего аргумента, слепо предполагая, что он присутствует), но он пропускает проверку для -и слепо предполагая, что это там, и никаких других аргументов никогда не будет q как второй персонаж.

Этот код должен быть реорганизован. Вот один из способов:

int main(int argc, char **argv) {

int testnum = 1;
for (int argi = 1; argi < argc; ++argi) {
if(argv[argi][0] == '-') {
switch (argv[argi][1]) {
case 'q':
if(argi + 1 == argc || argv[argi + 1][0] == '-') {
/* Handle missing argument error. */
return 1;
}
testnum = atoi(argv[++argi]);
break;
default:
/* Handle unrecognized flag error. */
return 1;
}
}
else
{
/* Handle non-flag parameter. */
}

/* Continue with program. */
return 0;
}
2

Этот код выглядит очень сумасшедшим. Я предполагаю, что вы намеревались сделать следующее:

int main(int argc,char **argv){
char** p = argv + 1;  // skipping program name

while (*p != 0) {     // over all parameters
testnum = 1;
if (*p[1] == 'q') {  // skipping - of "-q", not a good idea
p ++;
if (*p != 0) {     // may be null, read testnum from parameter,
// ?? no check whether this is an integer at all
testnum = atoi(*p);
}
}
}

(не проверено, может не скомпилировать и не работать)

0