2010-04-09 40 views
6
char p[4]={'h','g','y'}; 
cout<<strlen(p); 

in Mã này 3.Tại sao strlen không hoạt động đối với tôi?

char p[3]={'h','g','y'}; 
cout<<strlen(p); 

này in 8.

char p[]={'h','g','y'}; 
cout<<strlen(p); 

này một lần nữa in 8.

Xin hãy giúp tôi như tôi không thể hiểu tại sao ba khác nhau các giá trị được in bằng cách thay đổi kích thước của mảng.

+3

Tại sao CW này? –

+2

Ngoài ra, sử dụng 'char p [] =" hgy ";' – Pyrolistical

+3

@Paul: Bởi vì khoảng 17 người đã định dạng nó cùng một lúc. Cảnh báo chỉnh sửa đồng thời chỉ hoạt động nếu các chỉnh sửa mất hơn một phút. –

Trả lời

27

strlen bắt đầu từ con trỏ đã cho và tiến bộ cho đến khi nó đạt đến ký tự '\0'. Nếu bạn không có số '\0' trong mảng của mình, thì có thể là bất kỳ số nào cho đến khi đạt được số '\0'.

Cách khác để tiếp cận số bạn đang tìm kiếm (trong trường hợp bạn đã hiển thị) là sử dụng: int length = sizeof(p)/sizeof(*p);, sẽ cung cấp cho bạn độ dài của mảng. Tuy nhiên, đó không phải là độ dài chuỗi nghiêm ngặt như được xác định bởi strlen.

Như @ John Dibling đề cập, lý do mà strlen cho kết quả chính xác trong ví dụ đầu tiên của bạn là bạn đã cấp không gian cho 4 ký tự, nhưng chỉ được sử dụng 3; 1 ký tự còn lại được tự động khởi tạo thành 0, chính xác là ký tự '\0'strlen tìm kiếm.

+11

+1 đây là một phản ứng tốt. Điều duy nhất tôi sẽ thêm là giải thích tại sao đoạn mã đầu tiên hoạt động. Trong 'char p [4] = {'h', 'g', 'y'};' p là 4 ký tự, nhưng chỉ 3 được khởi tạo một cách rõ ràng, do đó trình biên dịch khởi tạo tất cả các phần tử còn lại (không xác định) thành '0'. –

+0

Tôi hoàn toàn đồng ý với nhận xét ở trên. – matias

0

'\0' chấm dứt bộ đệm char của bạn.

char p[4]={'h','g','y', '\0'}; 
+1

Trong ví dụ cụ thể này, '\ 0' cuối cùng là không cần thiết. Tất cả các phần tử không xác định sẽ được khởi tạo bằng không. –

1

Điều đó sẽ cho bạn một số ngẫu nhiên. strlen yêu cầu các chuỗi đó phải được chấm dứt bằng '\0 'để hoạt động.

+1

Nói đúng, số sẽ không xác định, không phải ngẫu nhiên. (ví dụ: không sử dụng strlen() làm cơ sở cho kết quả xổ số của bạn; ^)) –

1

thử điều này:

char p[4]={'h','g','y', '\0'}; 
4

Chỉ ví dụ đầu tiên của bạn có một null chấm dứt mảng các ký tự - hai ví dụ khác không có chấm dứt null, vì vậy bạn không thể sử dụng strlen() vào chúng một cách rõ ràng .

char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0' 

char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator 

char p[]={'h','g','y'}; // p[] implicitly sized to 3 - also no room for '\0' 

Lưu ý rằng trong trường hợp cuối cùng, nếu bạn sử dụng một chuỗi chữ để khởi tạo mảng, bạn sẽ nhận được một terminator null:

char p[]= "hgy"; // p[] has 4 elements, last one is '\0' 
0

này được vì strlen() hy vọng sẽ tìm thấy một null -terminator cho chuỗi. Trong trường hợp này, bạn không có nó, vì vậy strlen() tiếp tục đếm cho đến khi nó tìm thấy \ 0 hoặc đưa ra một vi phạm truy cập bộ nhớ và chương trình của bạn chết. YÊN NGHỈ!

1

strlen là chức năng thư viện chuẩn hoạt động với chuỗi (theo nghĩa C). Chuỗi được định nghĩa là một mảng của char giá trị kết thúc bằng giá trị \0. Nếu bạn cung cấp thứ gì đó không phải là chuỗi đến strlen, hành vi không xác định: mã có thể bị lỗi, mã có thể tạo ra kết quả vô nghĩa, v.v.

Chỉ trong ví dụ của bạn, ví dụ đầu tiên cung cấp strlen với một chuỗi , đó là lý do tại sao nó hoạt động như mong đợi. Trong trường hợp thứ hai và thứ ba, những gì bạn cung cấp không phải là một chuỗi (không chấm dứt với \0), đó là lý do tại sao kết quả dự kiến ​​không có ý nghĩa.

Các vấn đề liên quan