Một mảnh thông thường mã tôi sử dụng cho tách chuỗi đơn giản trông như thế này:Cách std :: stringstream có thể đặt lỗi/bit xấu?
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
return elems;
}
Có người nói rằng điều này sẽ âm thầm "nuốt" lỗi xảy ra trong std::getline
. Và tất nhiên tôi đồng ý như vậy. Nhưng nó đã xảy ra với tôi, những gì có thể có thể đi sai ở đây trong thực tế mà tôi sẽ cần phải lo lắng về. về cơ bản tất cả nắm như thế này:
inline std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
std::stringstream ss(s);
std::string item;
while(std::getline(ss, item, delim)) {
elems.push_back(item);
}
if(/* what error can I catch here? */) {
// *** How did we get here!? ***
}
return elems;
}
Một stringstream
được hỗ trợ bởi một string
, vì vậy chúng tôi không cần phải lo lắng về bất kỳ vấn đề liên quan đến việc đọc từ một tập tin. Không có chuyển đổi loại nào xảy ra ở đây vì getline
chỉ cần đọc cho đến khi nó thấy đường phân cách hoặc EOF
. Vì vậy, chúng tôi không thể nhận được bất kỳ lỗi nào giống như boost::lexical_cast
phải lo lắng.
Tôi chỉ đơn giản là không thể nghĩ ra điều gì đó ngoài việc không phân bổ đủ bộ nhớ có thể sai, nhưng điều đó sẽ chỉ ném một số std::bad_alloc
trước khi số std::getline
thậm chí diễn ra. Tôi đang thiếu gì?
Điều gì sai là trả lại tham chiếu đến địa phương. – UncleBens
Tốt bắt, mặc dù tôi không có nghĩa là trả lại một tham chiếu đến một địa phương, đây là một ví dụ cắt giảm để chứng minh những điều cơ bản của câu hỏi –
Một 'stringstream' được hỗ trợ bởi một' chuỗi' chỉ nếu bạn chưa gọi 'rdbuf (otherstreambuf)'. –