2010-12-07 21 views
9

Tengo un programa:C++, línea de comandos no ARGS siendo analizado adecuadamente

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; 

que espero imprimir todos los argumentos de línea de comandos. Sin embargo, la salida es la siguiente:

./Test.exe hola mundo

ARRANQUE entradas NUM: 3 . h w

Parece que sólo está mirando el primer carácter de cada argumento y no todo el char * hasta el carácter de terminación.

¿Alguien tiene alguna idea?

Notas adicionales: Crearlo a través de VS2008, y básicamente estoy copiando y pegando un ejemplo en Internet que debería funcionar. He ejecutado el programa en bash, powershell y cmd.

+3

Creo '_tmain()' espera 'tchar' – ruslik

+0

¿Sigue ocurriendo si coloca una función' main' en su programa? IE, después de cambiar el nombre de '_tmain' ... –

+0

Relacionado: [http://stackoverflow.com/questions/895827/what-is-the-difference-between-tmain-and-main-in-c] (http://stackoverflow.com/questions/895827/what-is-the-difference-between-tmain-and-main-in-c) –

Respuesta

3

¿Está compilando su código en modo Unicode?

+0

Esta es otra respuesta correcta. Cambié la configuración de mi proyecto a un conjunto de caracteres de varios bytes y funciona. ¡GRACIAS! – jbu

+0

@jbu: No hagas esto, perderás la funcionalidad Unicode. El modo MBCS es solo para compatibilidad con versiones anteriores. – Philipp

17

Su proyecto de Visual C++ está configurado en Unicode, y su función principal se llama _tmain. Esto significa que Windows invoca su función y le transmite cadenas Unicode, pero las trata como cadenas ANSI utilizando el tipo char *. Como el segundo byte del primer carácter Unicode es nulo, aparece como una cadena ANSI con un carácter.

+0

Esta es la respuesta correcta. Cambié la configuración de mi proyecto a un conjunto de caracteres de varios bytes y funciona. ¡GRACIAS! – jbu

+0

@jbu, por lo que podría querer establecerlo como la respuesta correcta. Una casilla de verificación debajo de los botones de votins. – khachik

+0

Suspiro ... esa no es exactamente la lección que deberías haber aprendido de esto, pero está bien. –

5

Es muy probable que se haya compilado con la configuración UNICODE. Debería utilizar wcout en lugar de cout si se define UNICODE. Y todas las cadenas deben ponerse dentro de _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; 
+0

o, alternativamente, suponiendo que '_UNICODE' siempre se defina (las compilaciones de MBCS ya no son realmente necesarias dado que Windows 9x murió hace mucho tiempo), use' wmain' y 'wchar_t' en todas partes. – Philipp

+0

También tenga en cuenta que 'wcout' aún no funciona, consulte http://blogs.msdn.com/b/michkap/archive/2010/10/07/10072032.aspx – Philipp

4

First char? Eso huele a que Unicode se interpreta como ANSI. Que tiene sentido. Si usa _tmain, entonces debe usar TCHAR.

Cuestiones relacionadas