2014-02-03 3 views
0

Мне нужна помощь, потому что я не получаю ожидаемый результат при попытке прочитать аргументы командной строки. Это действительно странно, потому что я скопировал и вставлял код в обычное консольное приложение, и оно работает так, как ожидалось. Стоит отметить, что я бегу Windows 7 и в визуальной студии я ставлю аргумент командной строки будет test.pngОшибка чтения аргументов командной строки в консольном приложении Win32?

Win32 код:

#include "stdafx.h" 

using namespace std; 

int _tmain(int argc, char* argv[]) 
{ 
    //Questions: why doesn't this work (but the one in helloworld does) 
    //What are object files? In unix I can execute using ./ but here I need to go to debug in top directory and execute the .exe 
    printf("hello\n"); 
    printf("First argument: %s\n", argv[0]); 
    printf("Second argument: %s\n", argv[1]); 

    int i; 
    scanf("%d", &i); 

    return 0; 
} 

Выход:

hello 
First Argument: C 
Second Argument: t 

Я пытался создавая простое консольное приложение и оно работает:

#include <iostream> 

using namespace std; 

int main(int arg, char* argv[]) 
{ 
    printf("hello\n"); 
    printf("First argument: %s\n", argv[0]); 
    printf("Second argument: %s\n", argv[1]); 

    int i; 
    scanf("%d", &i); 

    return 0; 
} 

Выход:

hello 
First Argument: path/to/hello_world.exe 
Second Argument: test.png 

Кто-нибудь знает, что происходит?

+3

Предполагаю, что у вас есть сборка Unicode, но они пытаются напечатать строки, как если бы они были Ansi. –

+0

@JonathanPotter Как это происходит, и все еще связь? Или это проблема в первую очередь (не строит)? Я согласен с тобой, я просто не понимаю, как это происходит. странный. – WhozCraig

+0

@WhozCraig: Я тоже, хотя нет гарантии, что здесь показан код * на самом деле * скомпилированный код. –

ответ

3

_tmain просто макрос, который меняется в зависимости от компилировать ли вы с Unicode или ASCII, если это ASCII, то это будет место main и если это Unicode, то это будет место wmain

Если вы хотите правильно Unicode декларация, которая принимает аргументы командной строки в Unicode, то вы должны объявить его принять строку Unicode, как это:

int wmain(int argc, wchar_t* argv[]);

вы можете прочитать больше об этом here

Еще одна проблема с вашим кодом заключается в том, что printf ожидает строку стиля ASCII C, а не Юникод. Используйте либо wprintf, либо используйте std::wcout для печати строки стиля Unicode.

#include <iostream> 
using namespace std; 

int wmain(int argc, wchar_t* argv[]) 
{ 
    //Questions: why doesn't this work (but the one in helloworld does) 
    //What are object files? In unix I can execute using ./ but here I need to go to debug in top directory and execute the .exe 
    std::cout << "Hello\n"; 
    std::wcout << "First argument: " << argv[0] << "\n"; 
    std::wcout << "Second argument: " << argv[1] << "\n"; 

    return 0; 
} 
+0

В чем разница? – user2316667

+0

@ user2316667 Отредактировано – Caesar

+0

Я изменил основную функцию на описанную вами, но я все еще получаю только первую букву. Отличная ссылка. – user2316667

Смежные вопросы