2009-06-14 46 views

Trả lời

29

Phương pháp đơn giản nhất là sử dụng atoi() chức năng tìm thấy trong stdlib.h:

CString s = "123"; 
int x = atoi(s); 

Tuy nhiên, điều này không đối phó tốt với các trường hợp chuỗi không chứa một số nguyên hợp lệ, trong trường hợp này bạn nên điều tra các strtol() chức năng:

CString s = "12zzz"; // bad integer 
char * p; 
int x = strtol (s, & p, 10); 
if (* p != 0) { 
    // s does not contain an integer 
} 
+4

vấp ở đây beacause trình biên dịch nói: "atoi: không thể chuyển đổi CString thành const char *"; sau đó tôi phát hiện ra câu trả lời của bạn không hoạt động nếu nó là một dự án unicode, _ttoi tốt hơn như được chỉ ra bởi Unagi – Zac

+0

lỗi C2664: 'atoi': không thể chuyển đổi tham số 1 từ 'CString' thành 'const char *' – maamaa

14
CString s; 
int i; 
i = _wtoi(s); // if you use wide charater formats 
i = _atoi(s); // otherwise 
+1

Bạn cần làm một cái gì đó với các giá trị trả về của những hàm này cho mã này có ích. –

+0

Có, tất nhiên bạn đúng. – PaV

7

bạn cũng có thể sử dụng sscanf cũ tốt.

CString s; 
int i; 
int j = _stscanf(s, _T("%d"), &i); 
if (j != 1) 
{ 
    // tranfer didn't work 
} 
33

Nếu bạn đang sử dụng TCHAR.H thường (ngầm, hoặc rõ ràng), hãy chắc chắn bạn sử dụng _ttoi() chức năng, do đó nó biên dịch cho cả bộ sưu Unicode và ANSI.

Thông tin chi tiết: https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx

-2

Bạn có thể sử dụng chức năng C atoi (trong mệnh đề try/catch vì việc chuyển đổi không phải lúc nào cũng có thể) Nhưng không có gì trong các lớp MFC để làm điều đó tốt hơn.

+0

Chào mừng bạn đến với stackoverflow. Bạn có thể đúng, nhưng có vẻ như [đã được đề cập đã trở lại trong năm 2009] (http://stackoverflow.com/a/992775/104223). (Khi bạn có đủ danh tiếng, bạn có thể thêm nhận xét vào câu trả lời hiện có) – Leigh

+3

atoi không tăng ngoại lệ –

2

Sự cố với câu trả lời được chấp nhận là nó không thể báo hiệu lỗi. Có strtol (STRING TO Long) có thể. Đó là một phần của một gia đình lớn hơn: wcstol (Chuỗi ký tự rộng ĐẾN dài, ví dụ: Unicode), strtoull (ĐỂ ký tên lâu dài, 64 bit +), wcstoull, strtof (TO Float) và wcstof.

6

Chức năng _ttoi có thể chuyển đổi CString thành số nguyên, cả char rộng và ansi char đều có thể hoạt động. Dưới đây là chi tiết:

CString str = _T("123"); 
int i = _ttoi(str); 
0

Xác định trong MSDN: https://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx

int atoi(
    const char *str 
); 
int _wtoi(
    const wchar_t *str 
); 
int _atoi_l(
    const char *str, 
    _locale_t locale 
); 
int _wtoi_l(
    const wchar_t *str, 
    _locale_t locale 
); 

CString là chuỗi wchar_t. Vì vậy, nếu bạn muốn chuyển đổi Cstring thành int, bạn có thể sử dụng:

CString s; 
int test = _wtoi(s) 
+0

'CString' phụ thuộc vào ký hiệu tiền xử lý' _UNICODE' và '_MBCS'. Nó có thể lưu trữ một chuỗi Unicode mã hóa UTF-16, một chuỗi ký tự DBCS hoặc một chuỗi ASCII. Đề nghị rằng nó sẽ luôn luôn là một chuỗi Unicode chỉ là sai, xin lỗi. – IInspectable

0

Giải pháp kinh điển là sử dụng Thư viện chuẩn C++ để chuyển đổi. Tùy thuộc vào loại trả về mong muốn, các chức năng chuyển đổi sau đây có sẵn: std::stoi, std::stol, or std::stoll (hoặc các đối tác chưa ký của chúng std::stoul, std::stoull).

Việc thực hiện là khá thẳng về phía trước:

int ToInt(const CString& str) { 
    return std::stoi({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

long ToLong(const CString& str) { 
    return std::stol({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

long long ToLongLong(const CString& str) { 
    return std::stoll({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

unsigned long ToULong(const CString& str) { 
    return std::stoul({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

unsigned long long ToULongLong(const CString& str) { 
    return std::stoull({ str.GetString(), static_cast<size_t>(str.GetLength()) }); 
} 

Tất cả những hiện thực báo cáo lỗi thông qua ngoại lệ (std::invalid_argument nếu không chuyển đổi có thể được thực hiện, std::out_of_range nếu giá trị chuyển đổi sẽ rơi ra khỏi phạm vi của các loại quả). Việc xây dựng tạm thời std::[w]string cũng có thể ném.

Việc triển khai có thể được sử dụng cho cả hai dự án Unicode cũng như MBCS.

1
CString s="143"; 
int x=atoi(s); 

hoặc

CString s=_T("143"); 
int x=_toti(s); 

atoi sẽ làm việc, nếu bạn muốn chuyển đổi CString để int.

Các vấn đề liên quan