char a[3]={‘a’,‘b’,‘1’};
puts(a);
màn hình : ab…(chữ ko thể nhìn)
tại sao lại thế ? nếu thay 1=’\0’ thì chỉ ra là:ab.
char a[3]={‘a’,‘b’,‘1’};
puts(a);
màn hình : ab…(chữ ko thể nhìn)
tại sao lại thế ? nếu thay 1=’\0’ thì chỉ ra là:ab.
Vì 1 chuỗi trong C cũng là 1 mảng thôi nhưng cuối chuỗi phải là ký tự '\0' - và công việc thực hiện với chuỗi cũng kết thúc khi gặp ký tự này nên khi bạn đặt '\0' ở đâu thì chuỗi cũng kết thúc tại đó. Đoạn code nên sửa thành
// Như vầy an toàn hơn.
char a[] = {'a', 'b', '1', '\0'};
puts(a);
// Kiểm tra độ dài:
printf("%d\n", strlen(a));
ab1
3
ok mình hiểu là cuối string là \0 nhưng cái vấn đề mình cần hỏi là vấn đề nó chạy ra cái sà nùi! Mình chạy vs thì thấy vậy nên hỏi!
Bởi vì kết thúc chuỗi là '\0' nên printf sẽ tìm trên vùng nhớ (kể cả phần ở ngoài phạm vị vùng nhớ của biến) và in ký tự đó ra, chừng nào gặp '\0' thì nó mới dừng. Và dĩ nhiên là ngoài vùng nhớ của biến thì có tùm lum các số, in ra màn hình cái sà nùi là đúng rồi.
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv) {
char a[] = {'a', 'b', '1'};
a[5] = '\0'; // chỉ là test, không nên dùng cách này để gán giá trị lớn hơn số lượng đã khai báo.
puts(a);
printf("%d\n", strlen(a));
return 0;
}
ab1�
5
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?