C ++, аргументы командной строки не анализируются должным образом - PullRequest
9 голосов
/ 08 декабря 2010

У меня есть программа:

int _tmain(int argc, char* argv[])
{
   std::cout << "STARTING" << std::endl;
   std::cout << "Num inputs: " << argc << std::endl;

   for(int i = 0; i < argc; i++)
      std::cout << argv[i] << std::endl;

что я ожидаю распечатать все аргументы командной строки. Однако вывод таков:

. / Test.exe Привет, мир

ЗАПУСК Количество входов: 3 , час ж

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

У кого-нибудь есть мысли?

Дополнительные примечания: Создание этого через VS2008, и я по сути копирую и вставляю пример в Интернете, который должен работать Я запустил программу в bash, powershell и cmd.

Ответы [ 4 ]

17 голосов
/ 08 декабря 2010

Ваш проект Visual C ++ настроен на Unicode, а ваша основная функция называется _tmain. Это означает, что Windows вызывает вашу функцию и передает вам строки Unicode, но вы рассматриваете их как строки ANSI, используя тип char *. Поскольку второй байт первого символа Unicode равен нулю, он отображается в виде строки ANSI с одним символом.

5 голосов
/ 08 декабря 2010

Скорее всего, он скомпилирован с настройками UNICODE.Вы должны использовать wcout вместо cout, если определено UNICODE.И все строки должны быть помещены внутрь _T().

#ifdef UNICODE
#define tout wcout
#else
#define tout cout
#endif 

int _tmain(int argc, TCHAR* argv[])
{
   std::tout << _T("STARTING") << std::endl;
   std::tout << _T("Num inputs: ") << argc << std::endl;

   for(int i = 0; i < argc; i++)
       std::tout << argv[i] << std::endl;
4 голосов
/ 08 декабря 2010

Первый символ?Это пахнет как Unicode, интерпретируемый как ANSI.Это имеет смысл.Если вы используете _tmain, то вы должны использовать TCHAR.

3 голосов
/ 08 декабря 2010

Вы компилируете свой код в режиме Unicode?

...