если я скомпилирую этот код под 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] отлично работает по какой-то причине.
почему это происходит?
Раздел 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)
.
char **argv
эквивалентен char *argv[]
.
ОК, как выясняется, проблема была в некотором коде, который я здесь не включил. мой код:
if (argc = 2) { do some stuff }
это должно было быть
if (argc == 2) { do some stuff }
я чувствую себя действительно глупо:\
Я могу догадаться, что либо вы входите как
(> program.exe "arg1 arg2"
или
(>program.exe arg1,arg2
argv[3]
? Это вводит неопределенное поведение в вашу программу.