2013-01-06 47 views
10

Tôi không thể hiểu những gì '\ 0' ở nơi khác hai có nghĩa là trong đoạn mã sau:' 0' có nghĩa là gì?

string x = "hhhdef\n"; 
cout << x << endl; 
x[3]='\0'; 
cout << x << endl; 
cout<<"hhh\0defef\n"<<endl; 

Kết quả:

hhhdef

hhhef

hhh

Bất kỳ ai có thể gi đã cho tôi một số gợi ý?

Trả lời

11

C++ std::string s là chuỗi "được tính" - nghĩa là độ dài của chúng được lưu trữ dưới dạng số nguyên và chúng có thể chứa bất kỳ ký tự nào. Khi bạn thay thế ký tự thứ ba bằng \0 không có gì đặc biệt xảy ra - nó được in như thể nó là bất kỳ ký tự nào khác (đặc biệt, bảng điều khiển của bạn đơn giản bỏ qua nó).

Trong dòng cuối cùng, thay vào đó, bạn đang in chuỗi C, có kết thúc được xác định bởi số \0 đầu tiên được tìm thấy. Trong trường hợp này, cout sẽ bật các ký tự in cho đến khi tìm thấy một số \0, trong trường hợp của bạn, là sau số h thứ ba.

1

\0 là nhân vật NULL, bạn có thể tìm thấy nó trong ASCII table của bạn, nó có giá trị 0.

Nó được sử dụng để quy kết thúc chuỗi C-phong cách.

Tuy nhiên, lớp C++ std::string lưu trữ kích thước của nó dưới dạng số nguyên và do đó không dựa vào nó.

4

C++ có hai loại chuỗi:

Việc xây dựng trong C kiểu null-terminated strings được thực sự chỉ byte mảng và tiêu chuẩn C++ thư viện std::string lớp học mà là không null chấm dứt.

In một chuỗi bị chấm dứt bằng null in mọi thứ cho đến ký tự null đầu tiên. In std::string in toàn bộ chuỗi, bất kể ký tự null ở giữa của nó.

+1

+1 Thanx để cập nhật cho tôi ... !!! Tôi có điểm số của bạn. –

+1

@LearnedfromMistake Đúng với tên người dùng của bạn. ;-) –

1

Bạn đang đại diện cho các chuỗi theo hai cách khác nhau ở đây, đó là lý do tại sao hành vi khác nhau.

Cách thứ hai dễ giải thích hơn; đó là mảng char thô kiểu C. Trong một chuỗi kiểu C, '\0' biểu thị null terminator; nó được sử dụng để đánh dấu sự kết thúc của chuỗi. Vì vậy, bất kỳ chức năng nào xử lý/hiển thị chuỗi sẽ dừng ngay sau khi chúng đạt được (đó là lý do tại sao chuỗi cuối cùng của bạn bị cắt bớt).

Ví dụ đầu tiên là tạo đối tượng C++ std::string hoàn chỉnh. Những điều này không chỉ định bất kỳ ý nghĩa đặc biệt nào đối với '\0' (chúng không có các ký tự null).