argc никогда не имеет значения выше 2

0

если я скомпилирую этот код под Visual Studio 2013

int main(int argc, char* argv[])
{
std::cout << "arg count: "<< argc << "/n";
}

а затем запустите его без дополнительных аргументов (т.е.> program.exe), он выдает

arg count: 1

с 1 аргументом (> program.exe arg1) выводит

arg count: 2

НО это - то, где это становится странным. если я ввожу (> program.exe arg1 arg2), он выводит

arg count: 2

"arg count" должно быть 3, не так ли?

с (> program.exe arg1 arg2 arg3) выводит

arg count: 2

это должно быть 4 в этом случае...

печать argv [3] отлично работает по какой-то причине.

почему это происходит?

  • 1
    А что происходит, когда вы избавляетесь от попытки напечатать argv[3] ? Это вводит неопределенное поведение в вашу программу.
  • 1
    Можете ли вы показать, как вы приводите эти аргументы? В частности, как вы называете программу?
Показать ещё 7 комментариев
Теги:
argc

3 ответа

2

Раздел 3.6.1 стандарта C++ определяет, как работают main и его аргументы:

В последнем виде для целей изложения первый параметр функции называется argc, а второй параметр функции называется argv, где argc - количество аргументов, переданных программе из среды, в которой выполняется программа. Если argc отличен от нуля, эти аргументы должны быть представлены в argv [0] через argv [argc-1] в качестве указателей на начальные символы многобайтовых строк с нулевым завершением (ntmbs s) (17.5.2.1.4.2) и argv [0] быть указателем на начальный символ ntmbs, который представляет имя, используемое для вызова программы или "". Значение argc должно быть неотрицательным. Значение argv [argc] должно быть 0. [Примечание. Рекомендуется добавлять дополнительные (необязательные) параметры после argv. -End note]

Это означает, что со стандартным компилятором вы должны иметь доступ к argv[argc]. Однако argv[n] к argv[n] с n> argc не определен. Это может привести к сбою, но не обязательно.

То, что вы испытываете, является странным, поскольку, по-видимому, аргументы обрабатываются как один аргумент. Если вы укажете аргументы точно так, как указано, этого не должно произойти.

Вы должны исправить подпись main. Стандарт гарантирует, по крайней мере, эти две подписи, все остальное определяется реализацией:

- функция(), возвращающая int и

- функция (int, указатель на указатель на char), возвращающая int

Поскольку вы хотите получить доступ к аргументам, соответствующая сигнатура является int main(int argc, char** argv).

  • 0
    моя проблема в том, что argc не отражает значение количества аргументов, я отредактировал вопрос, чтобы сделать его более кратким.
  • 0
    В контексте аргументов функции char **argv эквивалентен char *argv[] .
Показать ещё 3 комментария
1

ОК, как выясняется, проблема была в некотором коде, который я здесь не включил. мой код:

if (argc = 2) { do some stuff }

это должно было быть

if (argc == 2) { do some stuff }

я чувствую себя действительно глупо:\

  • 0
    Включите предупреждения, и такая ошибка больше не повторяется. Я не знаю флаг для VS2013, хотя.
  • 1
    уровень предупреждения 4. Щелкните правой кнопкой мыши проект в обозревателе решений, выберите «Свойства», в дереве слева щелкните «C / C ++», найдите «Уровень предупреждения» и опустите его, чтобы перейти на уровень 4. Не выбирайте все, большинство библиотек не могут быть чистыми на уровне All.
Показать ещё 2 комментария
0

Я могу догадаться, что либо вы входите как

(> program.exe "arg1 arg2"

или

(>program.exe arg1,arg2

Ещё вопросы

Сообщество Overcoder
Наверх
Меню