2010-08-31 43 views
21

Tôi hiện đang đọc từ tệp ini với cặp khóa/giá trị. tức làC++ std :: string to boolean

isValid = true 

Khi nhận cặp khóa/giá trị, tôi cần phải chuyển đổi chuỗi 'true' thành bool. Nếu không sử dụng tăng cường thì cách tốt nhất để làm điều này là gì?

Tôi biết tôi có thể so sánh chuỗi trên giá trị ("true", "false") nhưng tôi muốn thực hiện chuyển đổi mà không có chuỗi trong tệp ini phân biệt chữ hoa chữ thường.

Cảm ơn

Trả lời

29

Một giải pháp sẽ được sử dụng tolower() để nhận phiên bản chữ thường của chuỗi và sau đó so sánh hoặc sử dụng chuỗi luồng:

#include <sstream> 
#include <string> 
#include <iomanip> 
#include <algorithm> 
#include <cctype> 

bool to_bool(std::string str) { 
    std::transform(str.begin(), str.end(), str.begin(), ::tolower); 
    std::istringstream is(str); 
    bool b; 
    is >> std::boolalpha >> b; 
    return b; 
} 

// ... 
bool b = to_bool("tRuE"); 
+1

+1 câu trả lời hay + 1 cos khác tôi không biết về boolalpha. Lưu ý rằng tăng :: lexical_cast (mà không giống nhau) không phải là rất tha thứ về trường hợp hoặc – pm100

+0

này là thực sự mát mẻ ... Tôi đã không nhận thức được trước đây 'std :: boolalpha' – rmeador

+0

Tôi đã cố gắng sử dụng này nhưng nói rằng biến đổi isnt một phần của std. Tôi đã bao gồm Tôi đã bỏ lỡ điều gì? – Wesley

0

Nếu bạn không thể sử dụng tăng, hãy thử strcasecmp:

#include <cstring> 

std::string value = "TrUe"; 

bool isTrue = (strcasecmp("true",value.c_str()) == 0); 
+0

'strcasecmp' không tồn tại trong Windows. – zneak

+1

Ồ, thôi nào! Nghe có vẻ như một Boost là cách duy nhất để đi so sánh các chuỗi :-) Có nhiều cách dễ dàng hơn và hiệu quả nhất sau đó làm diễn viên từ vựng, thực sự. Đặc biệt là khi bạn biết chính xác những gì bạn đang làm và không tạo ra một thư viện chuyển đổi tất cả các mục đích-tất cả-trong-một. –

+0

@zneak - Windows có "stricmp" mặc dù (http://msdn.microsoft.com/en-us/library/k59z8dwe%28v=VS.80%29.aspx) –

0

Chữ thường chuỗi bằng cách lặp lại chuỗi và gọi tolower trên carachters, sau đó so sánh nó với "true" hoặc "false", nếu vỏ bọc là mối quan tâm duy nhất của bạn.

for (std::string::iterator iter = myString.begin(); iter != myString.end(); iter++) 
    *iter = tolower(*iter); 
+0

tolower() hoạt động trên một ký tự đơn, c_str() trả về một con trỏ tới một chuỗi không được sửa đổi. Vì vậy, ý tưởng này thực sự sẽ có hại. –

+0

@Uli Schlanchter Tôi lấy ý tưởng nó làm việc trên dây ở đâu? Cảm ơn cho bắt. – zneak

2
#include <string> 
#include <strings.h> 
#include <cstdlib> 
#include <iostream> 

bool 
string2bool (const std::string & v) 
{ 
    return !v.empty() && 
     (strcasecmp (v.c_str(), "true") == 0 || 
     atoi (v.c_str()) != 0); 
} 

int 
main() 
{ 
    std::string s; 
    std::cout << "Please enter string: " << std::flush; 
    std::cin >> s; 
    std::cout << "This is " << (string2bool (s) ? "true" : "false") << std::endl; 
} 

Một ví dụ đầu vào và đầu ra:

$ ./test 
Please enter string: 0 
This is false 
$ ./test 
Please enter string: 1 
This is true 
$ ./test 
Please enter string: 3 
This is true 
$ ./test 
Please enter string: TRuE 
This is true 
$ 
+0

'strcasecmp' là không di động. Một số nền tảng sử dụng 'stricmp', kỳ lạ. – greyfade