Cách tốt nhất để chuyển đổi chuỗi std :: thành bool là gì? Tôi đang gọi một hàm trả về "0" hoặc "1" và tôi cần một giải pháp sạch để chuyển giá trị này thành giá trị boolean.Chuyển đổi từ chuỗi std :: thành bool
Trả lời
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
bool to_bool(std::string const& s) {
return s != "0";
}
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!
Đâ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
@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. –
@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á. –
Hãy thử điều này:
bool value;
if(string == "1")
value = true;
else if(string == "0")
value = false;
bool to_bool(std::string const &string) {
return string[0] == '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.
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
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
@UncleBens - có thể nó sử dụng std :: string dưới dạng kiểu "biến thể". –
Đâ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());
}
Nhưng nhưng ... "DEADBEEF" sẽ được coi là sai! :-P –
Và tại sao nó lại đúng? –
@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. –
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";
}
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"
và "1"
bị vi phạm.
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
@GMan, tôi muốn là người đầu tiên nói rằng :) –
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 .
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;
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
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
Có, đó là dòng C++ https://www.cprogramming.com/tutorial/c++-iostreams.html. –
Ngoài ra còn có std :: stoi trong C++ 11:
giá trị bool = std :: stoi (someString.c_str());
- 1. cách chuyển đổi chuỗi thành bool
- 2. Chuyển đổi điều kiện bool phức tạp từ chuỗi thành bool trong .NET
- 3. Chuyển đổi bool thành QString
- 4. TypeScript: Chuyển đổi giá trị bool thành chuỗi
- 5. quá tải chuyển đổi không thành viên để bool hành
- 6. Chuyển đổi chuỗi C thành kiểu C++ std :: string
- 7. chuyển đổi Rcpp :: CharacterVector thành std :: string
- 8. Chuyển đổi một void * thành std :: string
- 9. Làm thế nào để chuyển đổi UTF-8 std :: chuỗi thành UTF-16 std :: wstring?
- 10. Chuyển đổi NULL thành chuỗi rỗng - Chuyển đổi không thành công khi chuyển đổi từ chuỗi ký tự thành uniqueidentifier
- 11. Chuyển đổi bool? để bool trong View
- 12. Chuyển đổi từ hex thành chuỗi
- 13. Chuyển đổi QString thành std :: string
- 14. Chuyển đổi std :: string thành std :: vector <char>
- 15. Chuyển đổi std :: string thành số nguyên
- 16. chuyển đổi std :: string thành basic_ostream?
- 17. Chuyển đổi uint64_t thành std :: string
- 18. chuyển đổi std: vector thành NSArray
- 19. boost :: variant - tại sao "const char *" được chuyển thành "bool"?
- 20. Làm cách nào để chuyển đổi từ chuỗi chuỗi thành chuỗi trong C++?
- 21. Không thể chuyển đổi hoàn toàn loại 'int' thành 'bool'
- 22. thể không mặc nhiên chuyển đổi loại 'string' thành 'bool'
- 23. Sắp xếp một std :: vector <std :: pair <std :: string, bool >> bởi chuỗi?
- 24. Chuyển đổi đôi thành chuỗi trong C++
- 25. Làm cách nào để chuyển đổi một BOOL thành một bool?
- 26. Chuyển đổi chuỗi thành char
- 27. Có hỗ trợ C++ 0x std :: chuyển đổi chuỗi ký tự thành/từ chuỗi byte UTF-8 không?
- 28. chuyển đổi giây thành kép thành std :: chrono :: duration?
- 29. Chuyển từ (chuỗi) thành Int
- 30. Chuyển đổi con trỏ "này" thành chuỗi
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
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
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