----> Lời khuyên cho các bạn bắt đầu học lập trình: nếu có tham khảo code trên mạng thì các bạn nên xem nó và tự viết lại rồi tìm hiểu xem từng phần trong code ý nó có mục đích là gì chứ đừng nên copy và paste một cách máy móc mà mình chả hiểu được code ý nó viết gì.
Chuỗi được xem như là một mảng 1 chiều gồm các phần tử có kiểu char như ký tự, con số và bất cứ ký tự đặc biệt như+, -, *, /, $, #…
Theo quy ước, một chuỗi sẽ được kết thúc bởi ký tự null (‘\0’ : kí tựrỗng).
VD:
01 02 03 04 05 06 07 08 09 10 | #include <stdio.h> int main() { char hoten[50]; // khai bao chuoi co toi da 50 ky tu printf("Xin chao, ten ban la gi?\nMinh la: "); scanf("%s", hoten); printf("Chao mung ban %s den voi Codecuatui.Xtgem.Com", hoten); return 0; } |
Kết quả:
Xin chao, ten ban la gi?
Minh la: trunganh ( do mình nhập vào nhé )
Chao mung ban trunganh den voi Codecuatui.Xtgem.Com
VD trên đã cho chúng ta cách khai báo xâu ký tự. Ngoài ra nó còn cho chúng ta biết cách nhập xuất luôn, tuy nhiên các bạn thử nhập với tên: Nguyễn Văn A, Hoàng Thị B và xem kết quả nhá.
Chú ý: Do chuỗi kết thúc bằng kí tự null, nên khi bạn khai báo chuỗi có chiều dài 50 kí tự chỉ có thể chứa 49 kí tự.
Khởi tạo chuỗi:
Ta có thể khởi tạo giá trị của xâu ngay từ khi khai báo:
1 | char hoten[50] = "trung anh"; // ok |
Tuy nhiên chúng ta không được gán giá trị khi đã khai báo.
1 2 | char hoten[50]; hoten = "trung anh"; // sai |
Nếu các bạn dùng hàm scanf để nhập chuỗi thì bạn sẽ thấy rằng không thể nhập được chuỗi có dấu cách hoặc nếu trước đó bạn nhập số thì sau đó không nhập được chuỗi nữa. Nếu không tin bạn có thể thử chạy với chương trình sau:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | #include <stdio.h> int main() { int tuoi = 0; // khai bao chuoi co toi da 30 ky tu char ten[30], tenNguoiYeu[30]; printf("Ho va ten cua ban ten la gi?"); scanf("%s", ten); // nhap chuoi khong can dau & printf("Ban bao nhieu tuoi roi?"); scanf("%d", &tuoi); printf("Nguoi yeu cua ban ten la gi?"); scanf("%s", tenNguoiYeu); printf("\n====\n"); printf("%s \n%d \n%s", ten, tuoi, tenNguoiYeu); system("pause"); // su dung de dung man hinh return 0; } |
Kết quả là bạn sẽ không nhập được tuổi và tên người yêu.
Lý do là scanf chỉ đọc được dữ liệu không có khoảng trắng (đấu cách, dấu tab, enter, …) và các khoảng cách này sẽ được lưu vào bộ đệm bàn phím do đó bạn chỉ nhận được chuỗi đầu tiên trước đấu cách mà thôi (chữ Nguyen), sau mỗi dấu cách, các giá trị tiếp theo nếu phù hợp với kiểu dữ liệu của các biến tiếp theo thì nó sẽ gán luôn cho chúng và bạn sẽ không được nhập nữa. Do tuoi kiểu nguyên nên không nhận được, tenNguoiYeu sẽ nhận giá trị tiếp theo trong các giá trị nhận được là chữ Van.
Hiện tượng như trên được gọi là hiện tượng trôi lệnh. Nếu bây giờ bạn thực hiện cho nhập số trước và chuỗi ngay sau đó thì hiện tượng này cũng xảy ra vì scanf không đọc được phím enter khi bạn nhấn lúc nhập xong số, nó được lưu vào bộ đệm và khi đọc giá trị nhập cho chuỗi nó tìm trong bộ đệm thấy ký tự enter là kiểu chuỗi nên nó gán luôn cho chuỗi đó.
Để nhập được chuỗi có khoảng trắng (dấu cách) chúng ta sử dụng hàm gets.
Để không bị trôi lệnh khi nhập số trước và chuỗi sau ta cần xóa bộ đệm bàn phím bằng lệnh fflush(stdin); ngay sau khi nhập số.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | #include <stdio.h> int main() { int tuoi = 0; // khai bao chuoi co toi da 30 ky tu char ten[30], tenNguoiYeu[30]; printf("Ho va ten cua ban ten la gi?"); gets(ten); // nhap chuoi khong can dau & printf("Ban bao nhieu tuoi roi?"); scanf("%d", &tuoi); fflush(stdin); printf("Nguoi yeu cua ban ten la gi?"); gets(tenNguoiYeu); printf("\n====\n"); printf("%s \n%d \n%s", ten, tuoi, tenNguoiYeu); system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; } |
Nếu bạn dùng Linux thì fflush(stdin); sẽ không hoạt động, bạn hãy tìm hiểu thêm về fflush(stdin) trong ubuntu(linux) để biết cách khắc phục.
Các hàm kiểm tra ký tự. (các hàm này trong thư viện ctype.h) Nếu đúng thì hàm cho giá trị khác 0. Nếu sai thì hàm cho giá trị bằng 0.
Các hàm sử lý xâu ký tự. (các hàm này nằm trong thư viện string.h)