Chúng ta sẽ cùng nhau bước sang phần 5 của khóa học lập trình C, bài đầu tiên chúng ta học là cách nhập xuất chuỗi trong C. Trong bài 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.
NỘI DUNG BÀI VIẾT
Chuỗi trong C?
Trong ngôn ngữ lập trình C, chuỗi là một tập hợp các ký tự [char] được lưu trữ trên các ô nhớ liên tiếp và luôn luôn có 1 ký tự null
là
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 0 báo hiệu kết thúc chuỗi.
int c[] = "c string"; Ví dụ, khi khai báo và khởi tạo chuỗi theo cách trên, trình biên dịch sẽ tự thêm 1 ký tự null
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 0 vào cuối.
Như vậy, nếu bạn muốn khai báo chuỗi để lưu
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 2 ký tự, bạn cần mảng ký tự có kích thước tối đa ít nhất là
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 3.
Cách khởi tạo giá trị cho chuỗi
Bạn có thể khởi tạo giá trị cho chuỗi theo 1 trong các cách dưới đây:
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; Nhưng không được làm như sau:
char c[5] = "abcde";
Bởi vì chuỗi của bạn có 5 ký tự cộng thêm 1 ký tự
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 0 là 6, sẽ bị vượt quá kích thước tối đa.
Cách nhập xuất chuỗi trong C
Bạn có thể sử dụng hàm
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 5 để nhập chuỗi không có chứa dấu trắng [dấu cách, dấu tab, dấu
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'};
- và hàm
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 7 để xuất chuỗi.
include
int main[] {
char name[20];
printf["Enter name: "];
scanf["%s", name];
printf["Your name is %s.", name];
return 0;
}Kết quả chạy:
Enter name: Hieu Nguyen Van Your name is Hieu. Nếu bạn để ý thì hàm
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 5 dùng dấu trắng để nhập nhiều input đồng thời. Do đó bạn chỉ nên dùng hàm `scanf[]` khi nhập chuỗi viết liền.
Cách nhập chuỗi có khoảng trắng
Để nhập chuỗi bao gồm cả dấu trắng, bạn nên sử dụng hàm
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 9 để nhập. Tương ứng, bạn cũng có thể in ra chuỗi bằng hàm
char c[5] = "abcde";
0.
include
int main[] {
char name[30];
printf["Enter name: "];
fgets[name, sizeof[name], stdin]; // read string
// gets[name]; // không nên dùng
printf["Name: "];
puts[name]; // display string
return 0;
}Kết quả:
Enter name: Hieu Nguyen Van Name: Hieu Nguyen Van Lưu ý:
- Bạn hoàn toàn có thể dùng hàm char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 7 để xuất chuỗi có khoảng trắng. Sự khác biệt là hàm char c[5] = "abcde"; 0 sẽ in thêm 1 dấu char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 6 ở cuối chuỗi.
- Hàm char c[5] = "abcde"; 4 cũng có thể dùng để nhập chuỗi theo cách ở dòng 7 [đã comment lại] trong đoạn code trên. Tuy nhiên hàm này không còn được khuyến khích được sử dụng vì nó không chỉ định kích thước tối đa của chuỗi => Có thể gây ra tràn bộ nhớ làm lỗi chương trình.
Chương trình không cho nhập chuỗi?
Nếu bạn làm việc với chuỗi mà xảy ra hiện tưởng chương trình bỏ qua bước nhập chuỗi của bạn thì đây là vấn đề. Hiện tượng này xảy ra do trước khi nhập chuỗi bạn có nhập vào 1 biến số nào đó; Điều đó khiến bộ nhớ đệm còn lưu lại ký tự
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 6.
Để khắc phục vấn đề này, bạn cần dùng hàm
char c[5] = "abcde";
6 để xóa bộ nhớ đệm khi dùng
char c[5] = "abcde";
4 và dùng
char c[5] = "abcde";
8 ở giữa các lần sử dụng
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 5 kết hợp với
char c[] = "abcd"; char c[50] = "abcd"; char c[] = {'a', 'b', 'c', 'd', '\0'}; char c[5] = {'a', 'b', 'c', 'd', '\0'}; 9 nhé.
// Nếu dùng fgets[]
include
int main[]{
int age;
char name[30];
printf["\nNhap tuoi: "]; scanf["%d", &age];
getchar[]; // đọc ký tự '\n'
printf["\nNhap ten: "]; fgets[name, sizeof name, stdin];
printf["%s - %d", name, age];
}
// Nếu dùng gets[] include
int main[]{
int age;
char name[30];
printf["\nNhap tuoi: "]; scanf["%d", &age];
fflush[stdin]; // đọc ký tự '\n'
printf["\nNhap ten: "]; gets[name];
printf["%s - %d", name, age];
}Kết quả chạy:
PS G:\c_cources\day_56> .\NoteFflush.exe Nhap tuoi: 30 Nhap ten: Nguyen Van Hieu Nguyen Van Hieu - 30
Bài tập thực hành
Có vô số bài tập thực hành về chuỗi đang chờ bạn giải tại website Luyện Code của Lập Trình Không Khó. Bạn có thể thực hành các bài tập trực tuyến, biết code mình đúng hay sai tại đây.