2010-01-29 41 views

Trả lời

29

Nó có lẽ sẽ quá mức cần thiết cho bạn, nhưng tôi muốn sử dụng boost::lexical_cast

boost::lexical_cast<bool>("1") // returns true 
boost::lexical_cast<bool>("0") // returns false 
+0

Vì giải pháp này bao gồm một số chi phí, bạn không nên sử dụng điều này khi hiệu suất là quan trọng. Hoặc chuyên tăng :: lexical_cast cho nhu cầu của riêng bạn. – smerlin

+0

Nếu bạn có thể đủ khả năng chuyển đổi chuỗi thành bool ... Dù sao, +1: đây là phương pháp mạnh mẽ nhất từ ​​trước đến nay. Và nếu nó quay ra quá chậm, nó sẽ không thể chuyên lexical_cast /cầu xin những người thúc đẩy để làm điều đó? :) – UncleBens

+2

Làm thế nào điều này mạnh mẽ hơn bất cứ điều gì khác? Hành vi của nó là không rõ ràng, ví dụ, số ngẫu nhiên nonzero trở thành sự thật, "đúng" và chuỗi rỗng nên ném ngoại lệ. (Không chắc chắn.) – Potatoswatter

37
bool to_bool(std::string const& s) { 
    return s != "0"; 
} 
2

Viết một hàm tự do:

bool ToBool(const std::string & s) { 
    return s.at(0) == '1'; 
} 

này nói về điều đơn giản mà có thể làm việc, nhưng bạn cần phải tự hỏi mình:

  • gì nên một sự trở lại chuỗi rỗng? phiên bản ở trên ném một ngoại lệ
  • ký tự nào khác với '1' hoặc '0' sẽ chuyển thành?
  • là một chuỗi có nhiều hơn một ký tự một đầu vào hợp lệ cho hàm này?

Tôi chắc chắn có những người khác - đây là niềm vui của thiết kế API!

+0

Đây là phương pháp tốt nhất, tôi nghĩ vậy. Sử dụng 'at' như kiểm tra là rất sạch sẽ. – GManNickG

+4

@GMan: Tôi không chắc mình đồng ý với điều đó. Trong C, 0 là sai, và mọi thứ khác là đúng. Do đó, 2 là đúng, 03 là đúng, vv Vì vậy, mặc dù câu hỏi là underspecified, đó là hợp lý để giả định rằng tất cả mọi thứ đó không phải là số không là sự thật. –

+0

@Chris Làm thế nào về "00"? Điểm của tôi trong câu trả lời này là ngay cả đối với một chức năng đơn giản như vậy, có rất nhiều vấn đề cần được khám phá. –

0

Hãy thử điều này:

bool value; 

if(string == "1") 
    value = true; 
else if(string == "0") 
    value = false; 
+2

Thật không may điều này để lại giá trị trong trạng thái chưa xác định nếu chuỗi nên chứa cái gì khác. – UncleBens

+3

@UncleBens: Nhiều khả năng, giá trị của nó sẽ là FileNotFound. :-P –

+1

Chris: Tôi rofl'd. – GManNickG

0
bool to_bool(std::string const &string) { 
    return string[0] == '1'; 
} 
1

Tôi muốn thay đổi chức năng xấu xí mà trả về chuỗi này ở nơi đầu tiên. Đó là những gì bool là cho.

+0

Tôi không có quyền kiểm soát chức năng này, nó là thư viện của bên thứ ba. – cquillen

+0

Thư viện có vẻ hơi ngu ngốc. Có bất kỳ lý do tại sao nó nên sử dụng 'std :: string' của tất cả mọi thứ cho một sự trở lại boolean? – UncleBens

+0

@UncleBens - có thể nó sử dụng std :: string dưới dạng kiểu "biến thể". –

0

Đây là một cách tương tự như Kyle trừ việc nó xử lý các zeroes hàng đầu và các công cụ:

bool to_bool(std::string const& s) { 
    return atoi(s.c_str()); 
} 
+3

Nhưng nhưng ... "DEADBEEF" sẽ được coi là sai! :-P –

+0

Và tại sao nó lại đúng? –

+0

@Andreas: Truyền thống C là 0 là sai và mọi thứ khác đều đúng. Lý tưởng nhất là tôi muốn ném một ngoại lệ trong trường hợp đó, nhưng nếu đó không phải là một lựa chọn, thì đúng là "ít sai" hơn là sai, theo quan điểm của tôi. –

2

tôi d sử dụng cái này, cái mà bạn muốn, và bắt được trường hợp lỗi.

bool to_bool(const std::string& x) { 
    assert(x == "0" || x == "1"); 
    return x == "1"; 
} 
0

Bạn có thể luôn luôn quấn chuỗi trả lại trong một lớp học để xử lý các khái niệm về chuỗi boolean:

class BoolString : public string 
{ 
public: 
    BoolString(string const &s) 
    : string(s) 
    { 
     if (s != "0" && s != "1") 
     { 
      throw invalid_argument(s); 
     } 
    } 

    operator bool() 
    { 
     return *this == "1"; 
    } 
} 

Gọi một cái gì đó như thế này:

BoolString bs(func_that_returns_string()); 
if (bs) ...; 
else ...; 

Mà sẽ ném invalid_argument nếu quy tắc về "0""1" bị vi phạm.

+1

Không phải mọi thứ đều phải là một lớp; một chức năng miễn phí sạch hơn và an toàn hơn nhiều. – GManNickG

+0

@GMan, tôi muốn là người đầu tiên nói rằng :) –

9

Hoặc bạn quan tâm đến khả năng có giá trị trả lại không hợp lệ hoặc bạn không. Hầu hết các câu trả lời cho đến nay là ở mặt đất trung gian, bắt một số chuỗi bên cạnh "0" và "1", có lẽ hợp lý hóa về cách chúng nên được chuyển đổi, có lẽ ném một ngoại lệ. Đầu vào không hợp lệ không thể tạo đầu ra hợp lệ và bạn không nên cố chấp nhận nó.

Nếu bạn không quan tâm đến lợi nhuận không hợp lệ, hãy sử dụng s[0] == '1'. Nó siêu đơn giản và rõ ràng. Nếu bạn phải biện minh cho sự khoan dung của mình với ai đó, hãy nói nó chuyển đổi đầu vào không hợp lệ thành sai, và chuỗi rỗng có thể là một đơn \0 trong việc triển khai STL của bạn để nó ổn định hợp lý. s == "1" cũng tốt, nhưng s != "0" có vẻ gây trở ngại cho tôi và làm cho không hợp lệ => true.

Nếu bạn quan tâm đến lỗi (và có khả năng nên), sử dụng

if (s.size() != 1 
|| s[0] < '0' || s[0] > '1') throw input_exception(); 
b = (s[0] == '1'); 

này bắt tất cả các lỗi, nó cũng thẳng thắn rõ ràng và đơn giản để bất cứ ai biết một smidgen của C, và không có gì sẽ thực hiện bất kỳ nhanh hơn .

61

Tôi ngạc nhiên là không ai đề cập này một:

bool b; 
istringstream("1") >> b; 

hoặc

bool b; 
istringstream("true") >> std::boolalpha >> b; 
+2

Danh tiếng không phải lúc nào cũng đi cùng với câu trả lời hàng đầu (imho). :) – gsamaras

+0

Rất tuyệt! Điều này làm việc cho tôi bằng cách sử dụng API Lua C.Tôi đoán C không có loại dữ liệu boolean ; lua_toboolean() trả về giá trị int là 0 hoặc 1, do đó, điều này dường như làm các thủ thuật trong C++. – Artorias2718

+0

Có, đó là dòng C++ https://www.cprogramming.com/tutorial/c++-iostreams.html. –

5

Ngoài ra còn có std :: stoi trong C++ 11:

giá trị bool = std :: stoi (someString.c_str());

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