2013-08-19 27 views
7

tôi muốn thay đổi một C++ chuỗi tại một chỉ số đặc biệt như thế này:C++, cách tốt nhất để thay đổi một chuỗi tại một chỉ số đặc biệt

string s = "abc"; 
s[1] = 'a'; 

là đoạn mã sau hợp lệ? Đây có phải là cách chấp nhận được để làm điều này không?

tôi không tìm thấy bất kỳ tài liệu tham khảo mà nói rằng đó là hợp lệ:

http://www.cplusplus.com/reference/string/string/

nào nói rằng thông qua "[] điều hành quá tải trong chuỗi" chúng ta có thể thực hiện các hoạt động viết.

+0

Vâng, không có vấn đề gì cả. Nếu bạn thực sự muốn tham chiếu, mục 21.4.5/2 của tiêu chuẩn C++ 11. –

+5

Ugh. Trong C++ 11 điều này thực sự bị cấm do lỗi trong tiêu chuẩn, và bạn * về mặt kỹ thuật * phải sử dụng 's.begin() [1] = 'a';' Nhưng nó không đáng lo ngại. – Potatoswatter

+0

Và bạn * đã * tìm thấy một tài liệu tham khảo cho biết nó là hợp lệ, mặc dù cplusplus.com nói chung là không đạt chuẩn và thường lỗi thời. Xem xét các liên kết, nó không rõ ràng những gì khác bạn muốn biết. – Potatoswatter

Trả lời

9

Vâng, C++ chương trình sau đây:

#include <iostream> 

int main() { 
    std::string s = "abc"; 
    s[1] = 'a'; 
    std::cout << s; 
} 

in aac. Bạn có nguy cơ vô tình ghi vào bộ nhớ không được chỉ định nếu chuỗi s là trống. C++ sẽ cho phép bạn làm điều đó và nó dẫn đến hành vi không xác định.

Cách an toàn để làm điều này sẽ được sử dụng string::replace: http://cplusplus.com/reference/string/string/replace

+1

Phiên bản an toàn sẽ sử dụng chuỗi :: thay thế http://www.cplusplus.com/reference/string/string/replace/ – Chris

1

Có. Trang web bạn liên kết có trang về nó. Bạn cũng có thể sử dụng tại hàm, thực hiện kiểm tra giới hạn.

http://www.cplusplus.com/reference/string/string/operator%5B%5D/

+1

@Potatoswatter Tại sao? Vấn đề là lập trình viên có thể chọn sử dụng kiểm tra giới hạn. –

+0

@NeilKirk: Tôi tưởng tượng nó thay đổi vì mọi người chỉ * giả định * rằng việc kiểm tra giới hạn đã được thực hiện và không biết về 'at()'. – cHao

+2

@Potatoswatter kiểm tra xem có gì không? Hàm này hoặc được gọi với một vị trí hợp lệ (kế toán * một * null terminator) hoặc hành vi là không xác định. Xem mệnh đề Yêu cầu. –

1

Có mã bạn đã viết là hợp lệ. Bạn cũng có thể thử:

string num; 
cin>>num; 
num.at(1)='a'; 
cout<<num; 

**Input**:asdf 
**Output**:aadf 

std :: thay thế cũng có thể được sử dụng để thay thế charecter. Đây là liên kết tham chiếu http://www.cplusplus.com/reference/string/string/replace/

Hy vọng điều này sẽ hữu ích.

0

Bạn có thể sử dụng chuỗi để đạt được điều này

string s = "abc"; 
    string new_s = s.substr(0,1) + "a" + s.substr(2); 
    cout << new_s; 
    //you can now use new_s as the variable to use with "aac"