Xử lý chuỗi ký tự trong c

Đọc chuỗi ký tự

Khi đọc một chuỗi ký tự bạn cần lưu ý phân biệt 2 cách đọc chuỗi ký tự dưới đây:

Kiểu 1: dùng printf()

char a[100];

scanf("%s", &a); // đọc chuỗi ký tự đầu tiên, không chứa dấu cách
Chú ý là hàm scanf chỉ đọc được một từ chứ không đọc được một đoạn

Ví dụ xâu nhập vào là “xin chao yeu lap trinh” thì đọc bằng scanf chỉ được “xin”. đọc scanf lần thứ 2 thì được “chao”

Để đọc hết cả dòng thì ta phải sử dụng hàm gets()

Kiểu 2: dùng gets()

Đọc hết từng dòng một

Ví dụ input là:

xin chào
yêu lập trình
thì đọc lần thứ nhất ta được xâu “xin chào”, lần thứ 2 ta được xâu “yêu lập trình”

Một số hàm xử lý xâu

Chuyển đổi xâu kí tự sang các kiểu số.

Vì một xâu kí tự có thể biểu diễn nhiều kiểu dữ liệu khác như dạng số nên việc chuyển đổi nội dung như vậy sang dạng số là rất hữu ích. Ví dụ, một xâu có thể mang giá trị “1977” đó là một chuỗi gồm 5 kí tự (kể cả kí tự null). Trong thư viện cstdlib (stdlib.h) đã cung cấp 3 macro/hàm hữu ích sau:

  • atoi: chuyển xâu thành kiểu int.
  • atol: chuyển xâu thành kiểu long.
  • atof: chuyển xâu thành kiểu float.

Tất cả các hàm này nhận một tham số và trả về giá trị số (int, long hoặc float). Các hàm này khi kết hợp với phương thức getline của cin là một cách đáng tin cậy hơn phương thức cin>> cổ điển khi yêu cầu người sử dụng nhập vào một số:

#include <iostream.h> #include <stdlib.h> int main (){ char mybuffer [100]; float price; int quantity; cout << “Enter price: “; cin.getline (mybuffer,100); price = atof (mybuffer); cout << “Enter quantity: “; cin.getline (mybuffer,100); quantity = atoi (mybuffer); cout << “Total price: ” << price*quantity; return 0;

}

Chạy chương trình:

Enter price: 2.75

Enter quantity: 21

Total price: 57.75

Các hàm xử lí xâu kí tự

Các hàm xử lí xâu kí tự nằm trong thư viện cstring (string.h), khi lập trình các bài toán liên quan đến xâu và các hàm xử lí xâu ta phải khai báo thư viện này. Dưới đây là giới thiệu lướt qua của các hàm thông dụng nhất:

Hàm strcpy(s, t);

Gán nội dung của xâu t cho xâu s (không được dùng dấu ‘=’). Hàm sẽ sao chép toàn bộ nội dung của xâu t (kể cả kí tự kết thúc xâu) vào cho xâu s. Để sử dụng hàm này cần đảm bảo độ dài của mảng s ít nhất cũng bằng độ dài của mảng t. Trong trường hợp ngược lại kí tự kết thúc xâu sẽ không được ghi vào s và điều này có thể gây treo máy khi chạy chương trình.

Ví dụ:

char s[10], t[10] ;

t = “Face” ; // không được dùng s = t ; // không được dùng

strcpy(t, “Face”) ; // được, gán “Face” cho t strcpy(s, t) ; // được, sao chép t sang s

cout << s << ” to ” << t ; // in ra: Face to Face

Hàm strncpy(s, t, n);

Sao chép n kí tự của t vào s. Hàm này chỉ làm nhiệm vụ sao chép, không tự động gắn kí tự kết thúc xâu cho s. Do vậy NLT phải thêm câu lệnh đặt kí tự ‘\0’ vào cuối xâu s sau khi sao chép xong.

Ví dụ:

char s[10], t[10] = “Steven”;

strncpy(s, t, 5) ; // copy 5 kí tự “Steve” vào s s[5] = ‘\0’ ; // đặt dấu kết thúc xâu

cout << s << ” is young brother of ” << t ;

// in câu: Steve is young brother of Steven

Một sử dụng có ích của hàm này là copy một xâu con bất kỳ của t và đặt vào s. Ví dụ cần copy xâu con dài 2 kí tự bắtđầu từ kí tự thứ 3 của xâu t và đặt vào s, ta viết strncpy(s, t+3, 2);

Ngoài ra xâu con được copy có thể được đặt vào vị trí bất kỳ của s (không nhất  thiết phải từ đầu xâu s) chẳng hạn đặt vào từ vị trí thứ 5, ta viết strncpy(s+5, t+3, 2);

Câu lệnh này có nghĩa: lấy 2 kí tự thứ 3 và thứ 4 của xâu t đặt vào 2 ô thứ 5 và thứ 6 của xâu s. Trên cơ sở này chúng ta có thể viết các đoạn chương trình ngắn để thay thế một đoạn con bất kỳ nào đó trong s bởi một đoạn con bất kỳ (có độ dài tương đương) trong t.

Hàm strcat(s, t);

Nối một bản sao của t vào sau s (thay cho phép +). Hiển nhiên hàm sẽ loại bỏ kí tự kết thúc xâu s trước khi nối thêm t. Việc nối sẽ đảm bảo lấy cả kí tự kết thúc của xâu t vào cho s (nếu s đủ chỗ) vì vậy NLT không cần thêm kí tự này vào cuối xâu. Tuy nhiên, hàm không kiểm tra xem liệu độ dài của s có đủ chỗ để nối thêm nội dung, việc kiểm tra này phải do NLT đảm nhiệm. Ví dụ:

char a[100] = “John”, b[4] = “Peter”; strcat(a,“and”);

strcat(a,b);

cout<<a // John and Peter

chars[100],t[100]=”Steve”; strncpy(s,t,3);s[3]=’\0′; // s = “Ste”

strcat(s,”p”); // s = “Step”

cout<<t<<“goes”<<s<<“by”<<s; // Steve goes Step by Step

Hàm strncat(s, t, n);

Nối bản sao n kí tự đầu tiên của xâu t vào sau xâu s. Hàm tự động đặt thêm dấu kết thúc xâu vào s sau khi nối xong (tương phản với strncpy()). Cũng giống strcat hàm đòi hỏi độ dài của s phải đủ chứa kết quả. Tương tự, có thể sử dụng cách viết strncat(s, t+k, n);

để nối n kí tự từ vị trí thứ k của xâu t cho s.

Ví dụ:

char s[20] = “Nha ” ; char t[] = “vua chua”

strncat(s, t, 3); // s = “Nha vua”

hoặc:

strncat(s, t+4, 4); // s = “Nha chua”

Hàm strcmp(s, t);

Hàm so sánh 2 xâu s và t (thay cho các phép toán so sánh). Giá trị trả lại là hiệu 2 kí tự khác nhau đầu tiên của s và t. Từ đó, nếu s1 < s2 thì hàm trả lại giá trị âm, bằng 0 nếu s1==s2, và dương nếu s1 > s2. Trong trường hợp chỉ quan tâm đến so sánh bằng, nếu hàm trả lại giá trị 0 là 2 xâu bằng nhau và nếu giá trị trả lại khác 0 là 2 xâu khác nhau.

Ví dụ: if (strcmp(s,t)) cout << “s khác t”; else cout << “s bằng t” ;

Hàm strncmp(s, t);

Giống hàm strcmp(s, t) nhưng chỉ so sánh tối đa n kí tự đầu tiên của hai xâu. Ví dụ:

char s[] = “Ha Noi” , t[] = “Ha noi” ; cout << strcmp(s,t) ; // -32 (vì ‘N’ = 78, ‘n’ = 110)

cout << strncmp(s, t, 3);// 0 (vì 3 kí tự đầu của s và t là như nhau)

Hàm strcmpi(s, t);

Như strcmp(s, t) nhưng không phân biệt chữ hoa, thường. Ví dụ:

char s[] = “Ha Noi” , t[] = “ha noi” ; cout << strcmpi(s, t) ;// 0 (vì s = t) Hàm strupr(s);

Hàm đổi xâu s thành in hoa, và cũng trả lại xâu in hoa đó. Ví dụ:

char s[10] = “Ha noi”; cout << strupr(s); // HA NOI cout << s; // HA NOI (s cũng thành in hoa)

Hàm strlwr(s);

Hàm đổi xâu s thành in thuờng, kết quả trả lại là xâu s. Ví dụ:

char s[10] = “Ha Noi” ; cout << strlwr(s); // ha noi

cout << s; // ha noi (s cũng thành in thường)

Hàm strlen(s);

Hàm trả giá trị là độ dài thực của xâu s. Ví dụ:

char s[10] = “Ha Noi” ; cout << strlen(s) ; // 5

 

Khuyên dùng

 

About Aida Nana

Nghề chính là chém gió, quăng bom và ném lựu đạn.
Nghề phụ là cắt cỏ, chém chuối, cưa cây......

Speak Your Mind

*