Lập trình C: Chuỗi (String)
Giải phóng thời gian, khai phóng năng lực
Một số khái niệm
Một chuỗi (string) là một tập hợp các ký tự kết thúc bằng ký tự '\0' (NULL) có thứ tự ký tự trong bảng mã ASCII là 0. Một mảng ký tự một chiều và hai chiều lần lượt được coi là một chuỗi và một mảng chuỗi.
Một biến chuỗi được sử dụng để lưu trữ một dãy các ký tự, đó là hằng chuỗi.
Một hằng chuỗi là một dãy các ký tự và bắt buộc phải đặt trong cặp nháy kép. Giả sử ta có một chuỗi với có nội dung là "V1Study.com", thì trong bộ nhớ nó được lưu trữ như sau:
'V' | '1' | 'S' | 't' | 'u' | 'd' | 'y' | '.' | 'c' | 'o' | 'm' | '\0' |
Ký tự '\0' được tự động thêm vào bởi trình dịch để đánh dấu điểm kết thúc của chuỗi. Vậy nên, ta nên khai báo một biến chuỗi với kích thước lớn hơn kích thước tối đa của chuỗi một đơn vị để có vị trí lưu trữ ký tự kết thúc.
Khai báo chuỗi
Bản chất của việc khai báo một chuỗi chính là khai báo một mảng ký tự một chiều. Vì thế, ta có cú pháp khai báo chuỗi như sau:
, trong đó, Tên_chuỗi do ta tự đặt tuân theo quy tắc đặt tên chung của ngôn ngữ C, Kích_thước là một số nguyên dương thể hiện số lượng ký tự tối đa của chuỗi.
Ví dụ, nếu bạn muốn khai báo một chuỗi có tên là str và có kích thước tối đa là 25 ký tự, ta có thể làm như sau: char str[26];
Dưới đây là một số ví dụ nữa về cách khai báo chuỗi:
Xin lưu ý là bạn không thể làm như sau:
Nhập liệu cho chuỗi
Sử dụng hàm gets() (thuộc thư viện <stdio.h>) được coi là cách thức đơn giản và phổ biến nhất để ta tiến hành nhập liệu cho chuỗi. Cú pháp sử dụng hàm này như sau: gets(Tên_chuỗi);
Ví dụ sau sẽ nhập liệu cho chuỗi a có kích thước tối đa là 30:
char a[30]; printf("\nMoi ban nhap mot chuoi: "); gets(a);
Ngoài ra, ta cũng có thể sử dụng hàm scanf() để nhập liệu cho chuỗi, khi đó ta sử dụng định dạng của chuỗi là %s. Lưu ý là scanf() không cho phép nhập chuỗi có dấu cách và do đó, khuyến nghị là không nên dùng hàm này để nhập chuỗi.
Chú ý: nếu trước khi nhập chuỗi ta đã nhập một số thì trong bộ đệm nhập liệu còn tồn tại ký tự Enter, khi đó ký tự này sẽ được đưa cho chuỗi dẫn đến không nhập liệu được. Để khắc phục điều này ta sử dụng lệnh sau đặt trước hàm gets(): fflush(stdin); . Ví dụ:
#include <stdio.h> main() { char a[30]; int n; printf("\nMoi nhap mot so: "); scanf("%d",&n); printf("\nMoi ban nhap mot chuoi: "); fflush(stdin); //<= ta cần sử dụng lệnh này // để đảm bảo bộ đệm nhập liệu không chứa // gì trước khi nhập chuỗi hoặc ký tự gets(a); return 0; }
Ví dụ về xử lý chuỗi
Viết chương trình chuyển đổi một chuỗi ký tự thường thành HOA. Dưới đây trình bày hai cách xử lý yêu cầu này.
* Cách 1: Dùng hàm toupper(ch) (thuộc thư viện <ctype.h>) để chuyển ký tự thường thành ký tự HOA. Chương trình được viết như sau:
#include<stdio.h> #include<ctype.h> #define n 20 main() { char s[n]; int i; printf("\nMoi nhap 1 chuoi bat ky: "); for ( i = 0 ; i < n ; i ++ ) s[i]=toupper(getchar()); //nhập ký tự và đổi thành hoa rồi lưu vào mảng kết xuất chuỗi s printf("\nChuoi sau khi duoc chuyen doi thanh chuoi in hoa:\n"); for(i=0; i<n; i++) putchar(s[i]); //in từng ký tự ra màn hình return 0; }
* Cách 2: Dùng hàm strupr(str) thuộc thư viện <string.h> để chuyển chuỗi str thành chuỗi in HOA. Chương trình được viết như sau:
#include<stdio.h> #include<string.h> main() { char str[30]; //khai báo một chuỗi có tối đa 30 ký tự do { printf("\nMoi ban nhap mot chuoi bat ky: "); gets(str); } while(strlen(str)==0 || strlen(str)>30); //yêu cầu nhập lại chuỗi khi kích thước bằng không hoặc vượt quá 30 strupr(str); //chuyển str thành chuỗi in hoa printf("\nChuoi sau khi chuyen: \"%s\"",str); return 0; }
Một ví dụ về kết quả chạy chương trình trên được thể hiện ở hình dưới đây:
Giải phóng thời gian, khai phóng năng lực