2008-12-02 6 views
9

Wie kann ich Ganzzahlen analysieren, die als Befehlszeilenargumente an eine Anwendung übergeben werden, wenn die App Unicode ist?Analysieren von Befehlszeilenargumenten in einer C++ - Unicode-Anwendung

Unicode-Anwendungen haben eine Haupt wie folgt aus:

int _tmain(int argc, _TCHAR* argv[]) 

argv ist ein wchar_t * [?]. Das heißt, ich kann Atoi benutzen. Wie kann ich es in eine ganze Zahl umwandeln? ist Stringstream die beste Option?

Antwort

6

, wenn Sie einen TCHAR-Array oder einen Zeiger auf den Beginn davon haben, können Sie std::basic_istringstream verwenden, um mit ihm zu arbeiten:

std::basic_istringstream<_TCHAR> ss(argv[x]); 
int number; 
ss >> number; 

Nun number ist die umgewandelte Zahl. Dies funktioniert im ANSI-Modus (_TCHAR ist typedef'ed zu char) und in Unicode (_TCHAR ist typedef_ed zu wchar_t, wie Sie sagen) Modus.

3

Ein TCHAR ist ein Zeichentyp, der sowohl für ANSI als auch für Unicode funktioniert. Schauen Sie in der MSDN-Dokumentation nach (ich nehme an, Sie sind auf Windows), es gibt TCHAR-Äquivalente für atoi und alle grundlegenden String-Funktionen (strcpy, strcmp usw.)

Das TCHAR-Äquivalent für atoi (. So könnte man schreiben:

int value = _ttoi(argv[1]); 
+1

das klingt nicht zu plattformunabhängig ... –

1

Ich persönlich würde stringstreams verwenden, hier ist ein Code zum Einstieg:

#include <sstream> 
#include <iostream> 

using namespace std; 

typedef basic_istringstream<_TCHAR> ITSS; 

int _tmain(int argc, _TCHAR *argv[]) { 

    ITSS s(argv[0]); 
    int i = 0; 
    s >> i; 
    if (s) { 
     cout << "i + 1 = " << i + 1 << endl; 
    } 
    else { 
     cerr << "Bad argument - expected integer" << endl; 
    } 
} 
1

Dry codiert und ich entwickeln sich nicht auf Windows, sondern TCLAP Verwendung dieses sollten Sie mit breiten Zeichen argv Werte laufen:

#include <iostream> 

#ifdef WINDOWS 
# define TCLAP_NAMESTARTSTRING "~~" 
# define TCLAP_FLAGSTARTSTRING "/" 
#endif 
#include "tclap/CmdLine.h" 

int main(int argc, _TCHAR *argv[]) { 
    int myInt = -1; 
    try { 
    TCLAP::ValueArg<int> intArg; 
    TCLAP::CmdLine cmd("this is a message", ' ', "0.99"); 
    cmd.add(intArg); 
    cmd.parse(argc, argv); 
    if (intArg.isSet()) 
     myInt = intArg.getValue(); 
    } catch (TCLAP::ArgException& e) { 
    std::cout << "ERROR: " << e.error() << " " << e.argId() << endl; 
    } 
    std::cout << "My Int: " << myInt << std::endl; 
    return 0; 
} 
Verwandte Themen