Làm thế nào để bạn xóa một biến chuỗi?


Câu trả lời:


771

Đối với tất cả các loại thư viện chuẩn, hàm thành viên empty()là một truy vấn, không phải là một lệnh, nghĩa là "bạn có trống không?" không "vui lòng vứt bỏ nội dung của bạn".

Hàm clear()thành viên được kế thừa từ iosvà được sử dụng để xóa trạng thái lỗi của luồng, ví dụ: nếu luồng tệp có trạng thái lỗi được đặt thành eofbit(cuối tệp), thì việc gọi clear()sẽ đặt trạng thái lỗi trở lại goodbit(không có lỗi) .

Để xóa nội dung của a stringstream, sử dụng:

m.str("");

là chính xác, mặc dù sử dụng:

m.str(std::string());

là kỹ thuật hiệu quả hơn, bởi vì bạn tránh gọi hàm std::stringtạo const char*. Nhưng bất kỳ trình biên dịch nào ngày nay sẽ có thể tạo cùng một mã trong cả hai trường hợp - vì vậy tôi sẽ chỉ đi với bất cứ thứ gì dễ đọc hơn.


105
Đây là những gì xảy ra khi bạn quên phần "Clear ()". stackoverflow.com/q/2848087/635549
galath

8
@KshitijBanerjee Tôi nghĩ trong C ++ m.str () và m.str ("") là hai hàm khác nhau. m.str () gọi một hàm không mong đợi bất kỳ tham số nào trong khi m.str ("") sẽ gọi hàm chấp nhận tham số const char *. m.str () có thể đã được triển khai như là một hàm get trả về chuỗi trong khi m.str ("") có thể đã được triển khai như một hàm tập hợp .
Dinesh PR

4
Như galath đã nói, việc thêm m.clear (); ngoài m.str ("");. Nếu không, bạn có thể gặp sự cố nếu tại một số điểm bạn điền vào chuỗi chuỗi bằng một chuỗi trống.
Sputnik

1
@anthropod Vâng, đó là năm ngoái. Tôi đã nhận được nó làm việc.
James

1
Oh boy là trực quan này. Cũng giống như mọi thứ khác về C ++!
trăng nắng

47

Bạn có thể xóa trạng thái lỗi và làm trống tất cả chuỗi trong một dòng

std::stringstream().swap(m); // swap m with a default constructed stringstream

Điều này có hiệu quả đặt lại m về trạng thái được xây dựng mặc định


3
Đây là cách hiệu quả và thanh lịch nhất để làm điều đó so với tất cả các câu trả lời khác ở đây. Tuy nhiên, std :: stringstream :: exchange là một tính năng của c ++ 11 và giải pháp này không hoạt động đối với các trình biên dịch c ++ 11 trước đó.
101010

4
Tính năng vẫn còn thiếu trong GNU g ++ v4.8, xem stackoverflow.com/questions/24429441/NH
Joachim W

7
@ 101010: Làm thế nào để hoán đổi tốt hơn so với chuyển nhượng?
Ded

2
@AsetD: Ngay cả khi nó không có ngoại lệ, bạn có quên tạm thời được xây dựng mặc định không?
Ded repeatator

3
Đây là hiệu quả thấp. Khi tôi muốn sử dụng lại ss gốc. Nó đổi chỗ trống cho tôi.
Zhang


33

Đây phải là cách đáng tin cậy nhất bất kể trình biên dịch:

m=std::stringstream();

2
Điều này tốt hơn theo ý kiến ​​của tôi vì m.str (""); khiến cho chuỗi của tôi bị mắc kẹt với giá trị trống đó bất cứ điều gì tôi đã thử. Nhưng sử dụng điều này tôi không gặp phải vấn đề đó
gelatine1

3
Tôi gặp vấn đề tương tự, vì tôi mm.clear(); mm.str("");đã làm điều đó. (không có C ++ 11, trao đổi khác sẽ tốt hơn).
hochl

1
@hochl: Tại sao sẽ swaptốt hơn chuyển nhượng?
Ded

4
Nó không tốt cho mọi tình huống. Điều này sẽ phân bổ lại bộ đệm mỗi lần trong khi mm.str ("") thì không.
Shital Shah

3
Trường hợp sử dụng chính của tôi để tuôn ra một đối tượng dòng chuỗi đang giữ một đối tượng chuỗi chuỗi tiêu đề xung quanh để ngăn chặn việc khởi tạo chuỗi không cần thiết - khởi tạo một đối tượng chuỗi mới sao chép đối tượng định vị toàn cầu - về mặt lý thuyết, điều này nhanh chóng và chỉ liên quan đến việc tăng một nguyên tử, nhưng ở mức độ đồng thời tôi đối phó với nó thường làm tê liệt.
Spacemoose

12

Tôi luôn luôn theo dõi nó:

{
    std::stringstream ss;
    ss << "what";
}

{
    std::stringstream ss;
    ss << "the";
}

{
    std::stringstream ss;
    ss << "heck";
}

1
Điều này có tốt hơn việc xóastringstream?
Robur_131

11

2 xu của tôi:

điều này dường như hoạt động với tôi trong xcode và dev-c ++, tôi đã có một chương trình ở dạng menu mà nếu được thực hiện lặp theo yêu cầu của người dùng sẽ điền vào một biến chuỗi sẽ hoạt động tốt trong lần đầu tiên mã sẽ hoạt động chạy nhưng sẽ không xóa chuỗi trong lần tiếp theo người dùng sẽ chạy cùng một mã. nhưng hai dòng mã dưới đây cuối cùng đã xóa biến chuỗi chuỗi mọi lúc trước khi điền vào biến chuỗi. (2 giờ dùng thử và lỗi và tìm kiếm google), btw, sử dụng từng dòng riêng sẽ không thực hiện được.

//clear the stringstream variable

sstm.str("");
sstm.clear();

//fill up the streamstream variable
sstm << "crap" << "morecrap";

-1

Đó là một vấn đề khái niệm.

Chuỗi dòng là một luồng, vì vậy các trình lặp của nó là chuyển tiếp, không thể trả về. Trong một chuỗi đầu ra, bạn cần tuôn ra () để xác định lại nó, như trong bất kỳ luồng đầu ra nào khác.


2
en.cppreference.com/w/cpp/io/basic_ostream/flush tuôn ra đồng bộ hóa với thiết bị lưu trữ mà nó được liên kết. Đây không phải là tái khởi động giống nhau.
Rõ ràng hơn

-12

Những thứ này không loại bỏ dữ liệu trong chuỗi chuỗi trong gnu c ++

    m.str("");
    m.str() = "";
    m.str(std::string());

Sau đây không làm trống chuỗi cho tôi:

    m.str().clear();

7
Tôi không chắc chắn điều này sẽ hoạt động, vì những lý do tương tự bernhardrusch sẽ không hoạt động. Hàm .str () trả về một bản sao và xóa bản sao đó sẽ không làm gì cả.
Verdagon

1
Giải pháp này KHÔNG hoạt động cho Microsoft Visual C ++.
Zak

Sai. Clear sẽ hoạt động trên chuỗi được trả về từ luồng chứ không phải chính luồng đó.
Joey Carson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.