2011-07-14 47 views
5

Tôi có một chuỗi có phần cuối cùng (hậu tố) cần được thay đổi nhiều lần và tôi cần tạo các chuỗi mới. Tôi đang cố gắng sử dụng ostringstream để làm điều này như tôi nghĩ, bằng cách sử dụng dòng sẽ nhanh hơn so với chuỗi nối. Nhưng khi hậu tố trước đó lớn hơn hậu tố trước, nó sẽ bị rối tung lên. Dòng suối cũng tắt các ký tự null.Tại sao dải ostringstream NULL?

#include<iostream> 
#include<sstream> 

using namespace std; 

int main() 
{ 
    ostringstream os; 
    streampos pos; 
    os << "Hello "; 
    pos = os.tellp(); 
    os << "Universe"; 
    os.seekp(pos); 
    cout<< os.str() << endl; 
    os << "World\0"; 
    cout<< os.str().c_str() << endl; 
    return 0; 
} 

Output

Hello Universe 
Hello Worldrse 

Nhưng tôi muốn Hello World. Làm thế nào để tôi làm điều này? Có cách nào khác để làm điều này một cách nhanh hơn?

Chỉnh sửa: Gắn thêm std::ends hoạt động. Nhưng tự hỏi nó hoạt động như thế nào trong nội bộ. Cũng giống như để biết nếu có những cách nhanh hơn để làm như vậy.

+1

Không như vậy chắc chắn rằng stringstream sẽ là hiệu quả nhất - bạn nên xem xét một trong những biến thể của 'std :: string: : replace() ' – Nim

Trả lời

3

Nó không loại bỏ bất kỳ thứ gì. Tất cả các chuỗi ký tự trong C++ được chấm dứt bởi NUL, do đó, bằng cách chèn một bằng tay bạn chỉ cần hoàn thành chuỗi, như xa như bất cứ ai xử lý nó là có liên quan. Sử dụng ostream::write hoặc ostream::put, nếu bạn cần làm điều đó - bất kỳ thứ gì mong đợi char* (không có đối số bổ sung cho kích thước) sẽ rất có thể coi nó là đặc biệt.

os.write("World\0", 6); 
9

Chuỗi "Thế giới" đã bị vô hiệu. Đó là cách chuỗi C hoạt động. "Thế giới \ 0" có hai ký tự \0. Do đó, operator<<(ostream&, const char*) sẽ xử lý chúng giống nhau và sao chép tất cả các ký tự lên đến \0. Bạn có thể thấy điều này rõ ràng hơn, nếu bạn thử os << "World\0!". Các ! sẽ không được sao chép ở tất cả, vì operator<< dừng lại ở \0 đầu tiên.

Vì vậy, nó không phải là ostringstream. Đó là cách các chuỗi C có tên là const char* hoạt động.

0

Tại sao bạn cho rằng hoạt động của luồng nhanh hơn chuỗi? Và tại sao xây dựng chuỗi trước khi xuất ra cout?

Nếu bạn muốn có một tiền tố để đầu ra của bạn, bạn chỉ có thể làm điều đó như thế này

const std::string prefix = "Hello "; 

std::cout << prefix << "Universe" << std::endl; 
std::cout << prefix << "World" << std::endl; 
Các vấn đề liên quan