2-байтовое представление аргументов командной строки в Visual Studio 2008 - PullRequest
2 голосов
/ 30 сентября 2011

У меня проблема при обработке аргументов командной строки в простом приложении C ++, написанном в Visual Studio 2008. Я написал следующий код:

#include <iostream>

using namespace std;

int _tmain(int argc, char **argv)
{
    char* c = *argv;    

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

    int a;
    cin >> a;

    return 0;    
}

Моя проблема в том, что только первый символ каждого аргумента командной строки записывается в cout.

Я определил причину, заключающуюся в том, что символы в аргументах командной строки представлены в виде 2 байтов, поэтому каждый второй 1 байт char содержит только нули, т.е.

Мой вопрос: почему это происходит? из того, что я нашел в примерах в сети, все должно работать так, как я написал. Кроме того, есть ли способ заставить символы в аргументах иметь 1-байтовое представление?

Надеюсь, мой вопрос достаточно ясен.

1 Ответ

5 голосов
/ 30 сентября 2011

Ваш _tmain получает символы UTF-16, которые при подаче латинского текста имеют 0 в каждом втором байте.Вы интерпретируете их как однобайтовые символы.Вы должны интерпретировать их как широкие символы.

Я бы написал это примерно так:

#include <iostream>

using namespace std;

int wmain(int argc, wchar_t* argv[])
{
  for(int i=0; i<argc; ++i) 
  {
    wcout << argv[i] << endl;
  }

  int a;
  wcin >> a;

  return 0;
}

Если вы не хотите использовать UTF-16, тогда вы можете придерживаться char вот так:

int main(int argc, char* argv[])
{
  for(int i=0; i<argc; ++i) 
  {
    cout << argv[i] << endl;
  }

  int a;
  cin >> a;

  return 0;
}

Обратите внимание на изменение именования функции main.В мире MS wmain получает wchar_t*, а main получает char*.

Если вы переключитесь на char*, вам также следует обновить конфигурацию вашего проекта, указав MBCS вместо Unicode.

Более подробную информацию об обработке основных функций компилятора MS можно найти здесь: main: Запуск программы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...