У меня почему-то возникают проблемы с анализом аргументов командной строки в Windows в C ++.
Я пытался использовать это
int main(int argc, char **argv)
{
std::cout << "Command-line argument count: " << argc << " \n";
std::cout << "Arguments:\n";
for (int i = 0; i < argc; i++)
std::cout << " argv[" << i << "] "<< argv[i] << "\n";
return 0;
}
так же как и это
int main(int argc, char *argv[])
{
std::cout << "Command-line argument count: " << argc << " \n";
std::cout << "Arguments:\n";
for (int i = 0; i < argc; i++)
std::cout << " argv[" << i << "] "<< argv[i] << "\n";
return 0;
}
Переменные argc
а также argv
кажется, как-то неинициализировано.
Вот что возвращает мне запуск программы:
Z:\Dev\ProcessSuspender\Debug>ProcessSuspender a
Command-line argument count: 2130558976
Arguments:
argv[0]
argv[1] ╠ÉÉÉÉÉj↑h╚♂YwÞØ÷■ âe³
argv[2]
(после аварии)
Я скомпилировал его с MSVC12, используя /SUBSYSTEM:CONSOLE
опция компоновщика.
Что может быть причиной этой проблемы?
Я вручную установил точку входа
main
, Использую ли я настройки проекта по умолчанию (_tmain
) или нет, проблема сохраняется.
В общем, вы не должны этого делать, если не знаете последствий. Типичные значения точка входа (/ENTRY
) должно быть либо:
[w]mainCRTStartup
, который вызывает [w]main
, или же[w]WinMainCRTStartup
, который вызывает [w]WinMain
, или же_DllMainCRTStartup
, который вызывает DllMain
,Зачем это нужно? Ну, то …CRTStartup
Семейство функций сделать пару важных вещей, в том числе инициализация:
argc
а также argv
, как вы случайно узнали.Так что для типичный Программа, которую вы, вероятно, хотите, чтобы она выполняла свою работу. В мире Linux существует эквивалентная функция под названием _start
это необходимо для выполнения тех же задач инициализации, которые можно переопределить с помощью -e
во время ссылки.
Путаница здесь, вероятно, связана с различием в неоднозначном значении слова «точка входа»: существует значение «кажущейся точки входа» с точки зрения языка (который main
и тому подобное), а также значение «истинной точки входа» с точки зрения языковой реализации (которая …CRTStartup
или же _start
).
Обратите внимание, что с помощью …CRTStartup
функции это не абсолютно необходимо, как вы, конечно, можете написать программу, которая избегает их использования. Это идет с ценой, однако:
argc
а также argv
используя Windows API (GetCommandLineW
а также CommandLineToArgvW
).Некоторые делают это, чтобы избежать зависимости от CRT или минимизировать размер исполняемого файла.
Я попробовал ваш проект на VS 2012, и он работает без сбоев.
Я добавил getchar (); команда как ниже:
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Command-line argument count: " << argc << " \n";
std::cout << "Arguments:\n";
for (int i = 0; i < argc; i++)
std::cout << " argv[" << i << "] "<< argv[i] << "\n";
getchar();
return 0;
}
чтобы я мог видеть результат.
Щелкните правой кнопкой мыши Project -> Properties -> debugging -> Command
Аргументы.
Это было пустым в моем проекте, и я добавил символ a, чтобы смоделировать вашу проблему.
Вот результат, который я получаю:
Щелкните правой кнопкой мыши по проекту -> Отладка -> Начать новый экземпляр -> вы бы
нравится строить это -> да
Выход:
Command-line argument count: 2
Arguments:
argv[0] <my macines path>\helpingStack1.exe
argv[1] a
Пожалуйста, проверьте это снова. Надеюсь, это поможет.
1) Я подозреваю, что ваши двоичные файлы не обновлены, когда вы запускаете этот скрипт, поэтому, пожалуйста, сделайте чистую сборку и убедитесь, что вы действительно запускаете тот же самый exe, что и тот, который вы собираете. Пожалуйста, проверьте конфигурацию — Debug / Release.
2) перейдите в папку, в которой вы создали проект, и щелкните правой кнопкой мыши на папке проекта, и измените свойство -> убедитесь, что только для чтения не установлен флажок.
Очевидно, что-то не так с IDE или проектом или, может быть, с настройками чего-либо еще только в вашей системе.
Код идеален.
Вы пытались напрямую и независимо запустить свой выходной exe, выполнив его через командную строку ??
Запустите ваш exe с командной строкой, указав несколько произвольных аргументов, и проверьте вывод.
стоит проверить свой набор символов в свойствах проекта -> Общие.