2009-07-11 4 views
3

У меня проблемы с Visual Studio 2008. Очень простая программа: печать строк, которые отправляются как аргументы.Visual C++ argv question

Почему это:

#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, а затем получил целые строки.

+6

Также обратите внимание, что argv [0] - это имя программы, таким образом, не является одним из аргументов. Кулачный момент, но тот, который может принести пользу будущим цивилизациям, которые происходят на этой веб-странице. –

ответ

19

По умолчанию _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 может быть Юникода или 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

Все примеры показывают, как напечатать элемент 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 
}