01/10/2018, 00:50

So sánh char và string trong c++!

Thân chào các chuyên gia!
Mình có 2 đoạn code về công dụng là như nhau nhưng điều mình muốn hỏi là giữa 2 đoạn code này thì đoạn nào là tối ưu hơn hoặc cách sử dụng cũng như vai trò trong những trường hợp nào thì ta cần đến nó!
Cám ơn các chuyên gia ạ!
Sau đây là 2 đoạn code: (Cùng là nhập vào họ tên ạ!)

SaNuCo viết 02:51 ngày 01/10/2018

-Nếu code đầu tiên nhập họ tên có 51 kí tự thì sao

-Nếu code thứ nhất tên chỉ cần 1 ký tự thì sẽ tốn có 1 byte

-Code 2 thì nó sẽ luôn tốn 28 byte kể cả đọ dài là bao nhiêu

Thành Lê viết 02:56 ngày 01/10/2018

kiểu string tốn 28 byte hả a ? lỡ th ngta nhập dài qua quý định thì leak memory sao a ?

Từ Gia Lộc viết 03:06 ngày 01/10/2018

Giới hạn của string dựa trên giới hạn của size_t
Và số kí tự tối đa nó có thể chứa là: 4294967291
Nó cũng còn tùy thuộc vào dung lượng bộ nhớ trên máy tính của Bạn có đủ hay không, hệ điều hành có cấp phát ô nhớ không

Theo bình thường thì MẢNG KÝ TỰ ( char[] ) thường dùng trong C
Còn qua C++ người ta dùng string
Cái nào cũng có ưu và nhược riêng
Ví dụ string là thuộc thư viện STL của C++ nên nó có nhiều phương thức kèm theo để hỗ trợ tính toán nhanh mà không cần phải đi viết lại hàm, ví dụ như .length 1 cái là Bạn có thể lấy ra được độ dài string, cũng như hỗ trợ các toán tử, nối chuỗi, so sánh chuỗi bla bla bla, còn với mảng char[] thì nó không hỗ trợ những cái đó, muốn có chức năng gì thì Bạn phải tự đi viết hàm riêng để xử lý, nhưng bù lại string bên C++ nó sẽ cần bộ nhớ nhiều hơn, dĩ nhiên, muốn nhanh thì bạn phải đánh đổi lại tài nguyên và ngược lại, không thể nào tối ưu cùng lúc cả 2 được

Huynh Nguyen viết 02:52 ngày 01/10/2018

À vâng! Cám ơn mọi người đã góp ý ạ!
Mình vẫn còn một thắc mắt nhỏ:
Tức là khi mà dùng mảng để nhập tên hay bất cứ thứ gì liên quan đến chuỗi ký tự thì… mình có thể cấp phát động để giảm nguy cơ hao tốn resource, sau đó khi thực thi xong thì mình giải phóng vùng nhớ đó được không ạ!
Và nếu như thế thì tại sao một số chương trình mình thấy vẫn sử dụng cách cũ còn một số chương trình thì lại cấp phát động ạ, có thể đây là một câu hỏi ngu nhưng mình “thích thì mình hỏi thôi”, mong các anh chị trong forum đừng chặc chém em… because I’m “a ma tơ”.

SaNuCo viết 02:52 ngày 01/10/2018
int chiLaViDuThoi()
{
	int *a = new int[2]{ 1,2 };
	return a[1];//Nếu return kiểu này không delete a được 
                        //.Dùng biến khác lưu giá trị delete rồi return nên nhiều khi rắc rối với bài toán lớn
}
int chiLaViDuThoi_()
{
	int a[2] ={1,2};
	return a[1];
}

Với lại thao táo với con trỏ nó có nhiều vấn đề phát sinh như quên delete,viết lộn thành *(a++) thì nó trỏ lung tung
Với lại cái gì cũng có sự phát triển và kế thừa.Giống như vật lý lợi bao nhiêu về lực thì thiệt bấy nhiêu về đường đi
-sizeof(string)==28 là tổng kích thước của biến thành phần.Khi tao ra 1 đối tượng string không biết là có dữ liệu gì thì nó vẫn tốn 28 byte.Bản chất của string là tạo từ con trỏ khi gán cho nó giá trị thì con trỏ trong đó sẽ lưu trữ ở Heap segment

Bài liên quan
0