2008-12-02 29 views
9

Làm cách nào để phân tích cú pháp số nguyên được chuyển đến một ứng dụng dưới dạng đối số dòng lệnh nếu ứng dụng là unicode?Phân tích đối số dòng lệnh trong ứng dụng unicode C++

ứng dụng Unicode có một chính như thế này:

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

argv là một wchar_t * [?]. Điều đó có nghĩa là tôi không thể sử dụng atoi. Làm thế nào tôi có thể chuyển đổi nó thành một số nguyên? stringstream là lựa chọn tốt nhất?

Trả lời

6

nếu bạn có một mảng TCHAR hoặc một con trỏ đến đầu của nó, bạn có thể sử dụng std::basic_istringstream để làm việc với nó:

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

Bây giờ, number là số chuyển đổi. Điều này sẽ làm việc trong chế độ ANSI (_TCHAR được đánh máy là char) và trong chế độ Unicode (_TCHAR được gõ vào chế độ wchar_t khi bạn nói).

3

TCHAR là loại ký tự hoạt động cho cả ANSI và Unicode. Tìm trong tài liệu MSDN (tôi giả sử bạn đang ở trên Windows), có TCHAR tương đương cho atoi và tất cả các hàm chuỗi cơ bản (strcpy, strcmp, v.v.)

Tương đương TCHAR cho atoi() là _ttoi() . Vì vậy, bạn có thể viết này:

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

không âm thanh nền tảng quá độc lập ... –

1

Cá nhân tôi sẽ sử dụng stringstreams, đây là một số mã để giúp bạn bắt đầu:

#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

khô mã hóa và tôi không phát triển trên Windows, nhưng sử dụng TCLAP, đây sẽ giúp bạn chạy với các ký tự rộng argv giá trị:

#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; 
} 
Các vấn đề liên quan