DÁNH SÁCH BÀI VIẾT Lập trình là gì? Một số khái niệm trong lập trình Cài đặt IDE Dev C++ – Môi trường lập trình C/C++ Làm quen với ngôn ngữ C – Chương trình Hello World Những cú pháp cơ bản Các kiểu dữ liệu Biến và Toán tử Vòng lặp for, while và do…while Câu lệnh điều kiện if else Cấu Trúc Rẽ Nhánh Switch … Case Từ khóa break và continue Mảng Hàm Tham biến và Tham trị Chuỗi ký tự Một số hàm xử lý chuỗi Con trỏ Đọc ghi file Struct – Dữ liệu kiểu cấc trúc
Trong bài viết này chúng ta sẽ làm rõ sự khác nhau giữa mảng và chuỗi, cách khởi tạo và khai báo chuỗi. Cách để nhập chuỗi có khoảng trắng và một số lưu ý khi làm việc với chuỗi.
Khái niệm
Chuỗi ký tự là một dãy gồm các ký tự hoặc một mảng các ký tự được kết thúc bằng ký tự ‘\0’ (còn được gọi là ký tự NULL trong bảng mã ASCII).
Các hằng chuỗi ký tự được đặt trong cặp dấu nháy kép “”.
Khai báo
Chuỗi là một mảng các ký tự có kiểu char, để khai báo chuỗi ta ta dùng cú pháp sau:
char tên_biên[độ_dài]
Ví dụ để khai báo chuỗi name với độ dài tối đa là 20 ký tự ta khai báo:
char name[20];
vừa khai báo vừa gán chuỗi giá trị:
char name[20] = "Nguyen Van A";
Nhập xuất chuỗi
Nhập chuỗi
Vì bản chất chuỗi cũng là một mảng nhưng có kiểu là char nên khi nhập chuỗi cũng có thể nhập từng phần tử cho chuỗi nhưng sẽ không ai sử dụng cách đó cả, mà sẽ nhập làm như sau:
char name[20];
printf("Moi ban nhap ten");
scanf("%s",&name):
%s là định dạng kiểu dữ liệu chuỗi.
Hoặc chúng ta cũng có thể sử dụng hàm gets() để nhập chuỗi như sau.
gets(name);
Tuy nhiên ở đây mình khuyến khích là nên sử dụng hàm gets(). Bởi vì 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.
Lý do là scanf chỉ đọc dữ liệu không bao gồm khoảng trắng (dấ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 dấu cách mà thôi.
Xuất chuỗi
Để xuất chuỗi ta cũng làm tương tự như nhập chuỗi nhưng thay vì sử dụng lệnh nhập là scanf ta dùng lệnh in là printf và cũng chọn kiểu định dạng là %s.
printf("%s", name);
Nhập chuỗi thay vì có lệnh gets() thì ở đây chúng ta có lệnh puts().
puts(name)
Ví dụ minh họa
Sử dụng lệnh scanf và printf
#include <stdio.h>
int main()
{
char ten[30];
printf("Nhap ten: ");
scanf("%s", &ten);
printf("Ten cua ban la: %s", ten);
}
Output
Vì lệnh scanf() không thể bắt được dấu cách như mình đã giải thích ở trên nên khi bạn nhập vào Nguyen Van A, nhưng chỉ có thể nhận được từ đầu tiên là Nguyen.
Sử dụng hàm gets() và puts()
#include <stdio.h>
int main()
{
char ten[30];
printf("Nhap ten: ");
gets(ten);
printf("Ten cua ban la: ");
puts(ten);
}
Output
Lúc này nhận được đầy đủ chuỗi Nguyen Van A.
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 chỉ đọc số theo đúng định dạng mà không đọc được phím enter khi bạn nhấn lúc nhập xong số (enter là ký tự hoặc cũng có thể coi là chuỗi), 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ố.
Ví dụ: không sử dụng lệnh fflush(stdin);
#include <stdio.h>
int main()
{
int tuoi = 0;
// khai bao chuoi co toi da 30 ky tu
char ten[30], queQuan[30];
printf("Nhap ho ten: ");
gets(ten); // nhap chuoi khong can dau &
printf("BNhap tuoi: ");
scanf("%d", &tuoi);
printf("Nhap que quan: ");
gets(queQuan);
printf("\n====\n");
printf("Ten: %s \nTuoi:%d \nQue quan:%s \n", ten, tuoi, queQuan);
return 0;
}
Output
Khi không sử dụng lệnh fflush(stdin); có thể thấy hiện tượng trôi lệnh đã sảy ra và bạn không thể nhập được Quê quán.
Ví dụ: Sử dụng lệnh fflush(stdin);
#include <stdio.h>
int main()
{
int tuoi = 0;
// khai bao chuoi co toi da 30 ky tu
char ten[30], queQuan[30];
printf("Nhap ho ten: ");
gets(ten); // nhap chuoi khong can dau &
printf("BNhap tuoi: ");
scanf("%d", &tuoi);
fflush(stdin);
printf("Nhap que quan: ");
gets(queQuan);
printf("\n====\n");
printf("Ten: %s \nTuoi:%d \nQue quan:%s \n", ten, tuoi, queQuan);
return 0;
}
Outout
Lúc này hiện tượng trôi lệnh không còn sảy ra nữa.