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 ạ.
Bài liên quan
Ủa, 2 lệnh
cout
này khác nhau à?dung do ban ban copy thu code di
Bạn chưa gán giá trị đầy đủ cho cả
so3
vàs4
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 :))
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.
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: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.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ước giờ em toàn dùng
NULL
, trong C# thì dùngnull
.cam on ban nhe ban giai thich rat chi tiet ^^.
cam on ban nhieu ^^>