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], это моя ошибка, а не авторы кода.
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
Как видно ранее, не указатель, поэтому он не может быть разыменован.
Этот код не выглядит правильно. **argv[0][1]
пытается разыменовать char
,
argv[0][1]
будет иметь смысл, а значит «взять второй char
из первых char*
в argv
Msgstr «ИМХО, код пытается обнаружить -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;
}
Этот код выглядит очень сумасшедшим. Я предполагаю, что вы намеревались сделать следующее:
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);
}
}
}
(не проверено, может не скомпилировать и не работать)