Visual C ++ argv вопрос - PullRequest
       174

Visual C ++ argv вопрос

3 голосов
/ 11 июля 2009

У меня возникли проблемы с Visual Studio 2008. Очень простая программа: печать строк, отправляемых в качестве аргументов.

Почему это:

#include <iostream>

using namespace std;

int _tmain(int argc, char* argv[])
{
    for (int c = 0; c < argc; c++)
    {
        cout << argv[c] << " ";
    }
}

Для этих аргументов:

program.exe testing one two three

Выход:

p t o t t

Я попытался сделать это с помощью gcc, а затем получил целые строки.

Ответы [ 2 ]

19 голосов
/ 11 июля 2009

По умолчанию _tmain принимает строки Unicode в качестве аргументов, но cout ожидает строки ANSI. Вот почему печатается только первый символ каждой строки.

Если вы хотите использовать Unicode _tmain, вы должны использовать его с TCHAR и wcout следующим образом:

int _tmain(int argc, TCHAR* argv[])
{
    for (int c = 0; c < argc; c++)
    {
       wcout << argv[c] << " ";
    }

    return 0;
}

Или, если вы счастливы использовать строки ANSI, используйте обычные main с char и cout, например:

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

    return 0;
}

Немного подробнее: TCHAR и _tmain могут быть Unicode или ANSI, в зависимости от настроек компилятора. Если определен UNICODE, который является значением по умолчанию для новых проектов, они говорят на Unicode. Это UNICODE не определено, они говорят ANSI. Таким образом, теоретически вы можете написать код, который не нужно менять между сборками Unicode и ANSI - вы можете выбрать во время компиляции то, что вам нужно.

Где это падает с cout (ANSI) и wcout (Unicode). Там нет _tcout или эквивалент. Но вы можете просто создать свой собственный и использовать это:

#if defined(UNICODE)
    #define _tcout wcout
#else
    #define _tcout cout
#endif

int _tmain(int argc, TCHAR* argv[])
{
    for (int c = 0; c < argc; c++)
    {
       _tcout << argv[c] << " ";
    }

    return 0;
}
0 голосов
/ 28 июня 2012

Все примеры показывают, как вывести элемент argv на стандартный вывод. Мне нужен код для преобразования в строку, и я использовал это:

string localeCode="en-us";
if(argc>1)
{
    #define LOCALELEN 50
    char localeArg[LOCALELEN+1];
    size_t result=-1;
    wcstombs_s(&result, localeArg, LOCALELEN, argv[1], LOCALELEN);
    if(result)
    {
       localeCode.assign(localeArg);
    }
    #undef LOCALELEN
}
...