01/10/2018, 09:31

Thắc mắc về chuỗi string trong c++

em có một chương trình đơn giản như sau.

#include<iostream>
#include<string.h>
using namespace std;
int main(){
	
char so3[10];
so3[0]='a';
cout<<so3<<endl;
char s4[10];
s4[0]='a';
cout<<s4;	
}

kết quả của lệnh cout trên sẽ ra a. nhưng của lệnh cout dưới sẽ nhận được một chuỗi kĩ tự gồm 3 phần tử. em thắc mắc ko hiểu vì sao chuỗi s4 của mình chưa khởi tạo gì nhưng khi gọi hàm strlen(s4) thì luôn luôn ra được đáp án là 3, nghĩa la trong chuỗi đã có sẵn 3 phần tử @@ ai giải thích dùm em được k ạ.

Trần Hoàn viết 11:42 ngày 01/10/2018

Ủa, 2 lệnh cout này khác nhau à?

Tran Hoang Son viết 11:41 ngày 01/10/2018

dung do ban ban copy thu code di

Trần Hoàn viết 11:42 ngày 01/10/2018

Bạn chưa gán giá trị đầy đủ cho cả so3s4 mới chỉ gán cho ký tự đầu tiên [0] nên các ô nhớ vẫn còn giá trị “rác” nào đó có sẵn trong các ô nhớ trên RAM mà được hệ điều hành cấp phát cho các biến này.
Bạn cứ thử tắt phần mềm C++ của bạn, rồi tắt máy. Rồi bật lên chạy thử xem nào :))

goneboy viết 11:35 ngày 01/10/2018

2 lệnh cout của em mục đich muốn in ra nguyên mảng ký tự s3 và s4.
Em khai báo nhưng chưa gán giá trị cho tất cả các phần tử của mảng --> các phần tử này sẽ mang giá trị rác (-52).
Khi cout ra sẽ bao gồm tất cả các phần tử rác này.

Gió viết 11:44 ngày 01/10/2018

Chương trình của bạn in ra giá trị rác khi dùng lệnh cout là do chuỗi của bạn chưa có kí tự NUL ('\0') kết thúc chuỗi. Một chuỗi ( string) trong c là một mảng kí tự và kết thúc bởi kí tự NUL, và mọi thao tác với chuỗi đều liên quan đến kí tự NUL này.
Như vậy, để gán chuỗi so3 là “a” thì ta có 2 cách:

//cách 1
so3[0]='a';
so3[1]='\0';
// cách 2
strcpy(so3,"a");

Người ta thường dùng cách 2 để gán chuỗi trong c hơn bởi bạn có thể hạn chế câu lệnh gán kí tự, và nhất là dễ quên '\0' khi kết thúc chuỗi.

Nguyễn Quốc Hoàng viết 11:31 ngày 01/10/2018

Nó in ra cho đến khi bắt gặp ký tự NUL (mã ASCII là 0) mà trong cái này bạn chỉ gán giá trị cho phần tử đầu tiên thôi, để in ra kết quả như ý muốn bạn hãy gán giá trị cho phần tử tieepd theo là 0 (số 0, không phải là ký tự ‘0’)

Trần Hoàn viết 11:38 ngày 01/10/2018

trước giờ em toàn dùng NULL, trong C# thì dùng null.

Tran Hoang Son viết 11:31 ngày 01/10/2018

cam on ban nhe ban giai thich rat chi tiet ^^.

Tran Hoang Son viết 11:47 ngày 01/10/2018

cam on ban nhieu ^^>

Bài liên quan
0