Tôi có một vấn đề mà sscanf giải quyết (giải nén mọi thứ từ một chuỗi). Tôi không thích sscanf mặc dù nó không an toàn và cũ kỹ và khủng khiếp. Tôi muốn được thông minh và sử dụng một số bộ phận hiện đại hơn của thư viện chuẩn C++. Tôi nên sử dụng cái gì?Tôi nên sử dụng cái gì thay vì sscanf?
Trả lời
Tôi nghĩ rằng các câu trả lời khác bị thiếu điểm. Câu hỏi không phải là về I/O, đó là về trích xuất dữ liệu từ một chuỗi.
Hãy thử stringstream:
#include <sstream>
...
std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
làm thế nào để biết nếu c không có, ví dụ chuỗi là "123 456"? – unludo
@unludo: Trong trường hợp đó, 'c' sẽ không được sửa đổi. Bạn có thể khởi tạo 'c' với một giá trị mặc định, hoặc bạn có thể cần phân tích phức tạp hơn. Một tokenizer có lẽ sẽ làm việc. –
Kể từ C++ 11, 'c' sẽ được đặt lại thành' 0' và trước đó tôi tin rằng giá trị sau thất bại của nó là không xác định. Dù sao, để kiểm tra xem 'c' có sử dụng trạng thái luồng (để thuận tiện không, từ' toán tử bool() '):' if (s >> a >> b) nếu (s >> c) abc_there(); else ab_there(); else didnt_have_a_and_b(); '. –
fgets hoặc strtol
Nếu bạn bao gồm sstream
bạn sẽ có quyền truy cập vào các lớp stringstream mà cung cấp dòng cho các chuỗi, đó là những gì bạn cần. Roguewave có một số tốt examples on how to use it.
Đối với hầu hết các công việc dòng tiêu chuẩn thực hiện công việc một cách hoàn hảo,
std::string data = "AraK 22 4.0";
std::stringstream convertor(data);
std::string name;
int age;
double gpa;
convertor >> name >> age >> gpa;
if(convertor.fail() == true)
{
// if the data string is not well-formatted do what ever you want here
}
Nếu bạn cần các công cụ mạnh hơn cho phân tích cú pháp phức tạp hơn, sau đó bạn có thể xem xét Regex hoặc thậm chí Thần từ Boost.
Nếu bạn thực sự không muốn sử dụng luồng (Rất tốt vì dễ đọc), bạn có thể sử dụng StringPrintf.
Bạn có thể tìm thấy việc thực hiện nó trong Folly:
https://github.com/facebook/folly/blob/master/folly/String.h#L165
Đoạn mã nhỏ (Tôi đang sử dụng một cái gì đó gần như giống nhau), mặc dù nó là một thay thế cho 'printf' thay vì' sscanf'. –
- 1. Tôi nên sử dụng gì thay vì printf trong Perl?
- 2. Tôi nên sử dụng gì thay vì LoadWithPartialName()?
- 3. Tôi nên sử dụng gì thay vì com.google.appengine.repackaged *?
- 4. Tôi nên sử dụng gì thay vì windows.h trong linux
- 5. Vì Python không có câu lệnh chuyển đổi, tôi nên sử dụng cái gì?
- 6. Tại sao không nên sử dụng attach() trong R, và tôi nên sử dụng cái gì?
- 7. Tôi có nên sử dụng String thay vì TFilename không?
- 8. Khi nào tôi nên sử dụng UIImagePickerControllerSourceTypePhotoLibrary thay vì UIImagePickerControllerSourceTypeSavedPhotosAlbum?
- 9. Tôi có nên sử dụng NoSQL thay vì MySQL không?
- 10. Khi nào tôi nên sử dụng UserControl thay vì Trang?
- 11. Android: Tôi nên làm gì thay vì sử dụng chức năng không dùng nữa (getwidth())?
- 12. Tại sao nên sử dụng GWT.create() thay vì mới?
- 13. Vì lý do gì tôi nên thử?
- 14. enum hoặc xác định, cái nào tôi nên sử dụng?
- 15. Tôi nên sử dụng cái nào? Backbone.js Router.navigate và window.location.hash
- 16. JTable.clearSelection() vs Jtable.getSelectionModel.clearSelection() - Khi nào nên sử dụng cái gì?
- 17. Không có strsafe.h trong MinGW? Nên sử dụng cái gì?
- 18. Sử dụng "làm bool?" thay vì "đối tượng một cái gì đó = ViewState [" hi "]"
- 19. Tại sao nên sử dụng Function.prototype.bind thay vì Function.prototype.call?
- 20. Tôi nên sử dụng cái nào? decimal.Add() hoặc "+"
- 21. Tại sao tôi nên POST dữ liệu thay vì GET?
- 22. khi nào nên sử dụng index.php thay vì index.html
- 23. Đánh giá là điều xấu ... Vậy tôi nên sử dụng cái gì?
- 24. Khi nào nên sử dụng zip thay vì izip?
- 25. Exponentiation in Python - tôi có nên sử dụng toán tử thay vì math.pow và math.sqrt không?
- 26. Khi nào tôi nên sử dụng NSURL thay vì NSString và ngược lại?
- 27. Tôi nên sử dụng cái gì cho lớp BigInt trong .NET?
- 28. Tôi có nên sử dụng System.out.println() hoặc cái gì khác không?
- 29. Tại sao tôi nên sử dụng Cá chép thay vì cảnh báo trong Perl?
- 30. Trong Java, khi nào tôi nên sử dụng "Object o" thay vì Generics?
Tại sao cố gắng để được "thông minh"? –
Ví dụ với lý do ông nói, sscanf đó không an toàn. – jalf
@Kaleb Pederson: Đối với nhiều người nói tiếng Anh, "thông minh" có thể chỉ có nghĩa là "thông minh" và không có ý nghĩa tiêu cực đôi khi có ở Hoa Kỳ. Lưu ý rằng Ben Hymers đến từ Vương quốc Anh. – Naaff