01/10/2018, 17:15

Vì sao có thể thay đổi 1 ký tự trong một chuỗi trong C++

Mình đang đọc tới bài chuỗi trong tutorial C++ của forum thì có gặp 1 câu như sau:

Khai báo và khởi tạo bằng một chuỗi kí tự cố định:

char foo[] = "Le Tran Dat";
Chương trình sẽ tự động cấp phát bộ nhớ vừa đủ để lưu 11 kí tự của chuỗi mình đã gán, và 1 ô nhớ để lưu thêm kí tự kết thúc chuỗi ‘’. Chương trình sẽ tự động thêm vào kí tự kết thúc chuỗi ‘’ khi khởi tạo cho mảng kí tự bằng một chuỗi các kí tự như trên.

Với cách khởi tạo này, mình gán luôn cho mảng kí tự foo một chuỗi kí tự được đặt trong cặp dấu nháy kép. Chuỗi kí tự trong cặp dấu nháy kép này được coi như là một chuỗi cố định (tương tự hằng số) và chúng ta không thế thay đổi kí tự khác cho bất kì phần tử nào trong mảng.

Mình thử làm 1 chương trình tương tự để kiểm tra thì vẫn có thể thay đổi đươc ký tự ấy:

#include <iostream>

using namespace std;

int main()
{
    char str[] = "Hello world!";
    cout << str << endl;
    str[1] = 'f';
    cout << str;
    return 0;
}

Và ideone.com vẫn cho kết quả bình thường: https://ideone.com/ThXMe6

Mọi người có thể giải thích khuất mắt chỗ này xíu cho mình được ko ạ?
Cảm ơn !

rogp10 viết 19:24 ngày 01/10/2018

khuất mắt

khúc mắc


Như vậy là tài liệu chưa chuẩn.

char foo[] = "Le Tran Dat";

Đây chỉ là mảng foo[] không có gì đặc biệt.

Nhưng:

char* foo = "Le Tran Dat";

thì con trỏ foo trỏ vào vùng nhớ hằng (viết trong binary luôn) và sẽ gây lỗi như đã đề cập.

Secret viết 19:29 ngày 01/10/2018

Dạ cảm ơn anh ^^
Mà cho em hỏi thêm là nếu trong C++ để nhập chuỗi có khoảng trắng thì dùng cin.getline() sẽ an toàn hơn dùng hàm gets() của C ạ?

HK boy viết 19:29 ngày 01/10/2018

Đã code C++ thì dùng luôn cin.getline() đi bạn. Dùng luôn std::string nữa.

Bài liên quan
0