Проблемы с аргументами командной строки C ++ в Windows

У меня почему-то возникают проблемы с анализом аргументов командной строки в 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 опция компоновщика.
Что может быть причиной этой проблемы?

1

Решение

Я вручную установил точку входа main, Использую ли я настройки проекта по умолчанию (_tmain) или нет, проблема сохраняется.

В общем, вы не должны этого делать, если не знаете последствий. Типичные значения точка входа (/ENTRY) должно быть либо:

  • [w]mainCRTStartup, который вызывает [w]main, или же
  • [w]WinMainCRTStartup, который вызывает [w]WinMain, или же
  • _DllMainCRTStartup, который вызывает DllMain,

Зачем это нужно? Ну, то …CRTStartupСемейство функций сделать пару важных вещей, в том числе инициализация:

  • время выполнения C (CRT),
  • любые глобальные переменные, и
  • аргументы argc а также argv, как вы случайно узнали.

Так что для типичный Программа, которую вы, вероятно, хотите, чтобы она выполняла свою работу. В мире Linux существует эквивалентная функция под названием _start это необходимо для выполнения тех же задач инициализации, которые можно переопределить с помощью -e во время ссылки.

Путаница здесь, вероятно, связана с различием в неоднозначном значении слова «точка входа»: существует значение «кажущейся точки входа» с точки зрения языка (который main и тому подобное), а также значение «истинной точки входа» с точки зрения языковой реализации (которая …CRTStartup или же _start).

Обратите внимание, что с помощью …CRTStartup функции это не абсолютно необходимо, как вы, конечно, можете написать программу, которая избегает их использования. Это идет с ценой, однако:

  • вы не можете использовать среду выполнения C, поэтому вы не можете использовать большую часть стандартной библиотеки,
  • вам нужно вручную инициализировать любые глобальные переменные, и
  • вам нужно вручную получить argc а также argv используя Windows API (GetCommandLineW а также CommandLineToArgvW).

Некоторые делают это, чтобы избежать зависимости от CRT или минимизировать размер исполняемого файла.

6

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

Я попробовал ваш проект на 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) перейдите в папку, в которой вы создали проект, и щелкните правой кнопкой мыши на папке проекта, и измените свойство -> убедитесь, что только для чтения не установлен флажок.

1

Очевидно, что-то не так с IDE или проектом или, может быть, с настройками чего-либо еще только в вашей системе.
Код идеален.

Вы пытались напрямую и независимо запустить свой выходной exe, выполнив его через командную строку ??

Запустите ваш exe с командной строкой, указав несколько произвольных аргументов, и проверьте вывод.

0

стоит проверить свой набор символов в свойствах проекта -> Общие.

-1
По вопросам рекламы [email protected]