Nhap 2 chuỗi ký tự s1 và s2 có chiều dài tối đa 254 ký tự so sánh 2 chuỗi s1 và s2

Tiếp theo bài viết Chuỗi là gì? Hàm nhập xuất chuỗi trong C/C++  sinhvientot.net gởi đến bạn Hướng dẫn sử dụng các hàm xử lý chuỗi trong C như;  strcpy,  strdup, strrev, strcat, strlen, strstr, strlwr/strupr, strcmp/stricmp, …

Một số hàm xử lý chuỗi

Các hàm này có trong string.h

Cộng chuỗi

Cú pháp: char *strcat(char *des, const char *source)  

Hàm này có tác dụng Nối xâu ký tự source vào sau xâu ký tự des.

Chú ý: des phải đủ lớn để chứa source

Ví dụ: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình.

#include  #include  #include  void main()  {      char HoLot[30], Ten[12];      printf("Nhap Ho Lot: "); gets(HoLot);      printf("Nhap Ten: "); gets(Ten);      strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/      printf("Ho ten la: "); puts(HoLot);      getch();      }

Xác định độ dài chuỗi

Cú pháp: int strlen(const char* s)

Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím.

#include  #include  #include  void main() {      char Chuoi[255];      int Dodai;      printf("Nhap chuoi: "); gets(Chuoi);      Dodai = strlen(Chuoi);      printf("Chuoi vua nhap: "); puts(Chuoi);      printf("Co do dai %d",Dodai);      getch();      }

Đổi một ký tự thường thành ký tự hoa

– Hàm toupper(): Hàm toupper() (trong ctype.h) được dùng để chuyển đổi một ký tự thường thành ký tự hoa.

Cú pháp: char toupper(char c)

Đổi chuỗi chữ thường thành chuỗi chữ hoa

– Hàm strupr(): Hàm struppr() được dùng để chuyển đổi chuỗi chữ thường thành chuỗi chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi.

Cú pháp: char *strupr(char *s)

Ví dụ: Viết chương trình nhập vào một chuỗi ký tự từ bàn phím. Sau đó sử dụng hàm strupr() để chuyển đổi chúng thành chuỗi chữ hoa.

#include  #include  #include  void main()  {      char Chuoi[255],*s;      printf("Nhap chuoi: ");    gets(Chuoi);      s=strupr(Chuoi) ;      printf("Chuoi chu hoa: ");     puts(s);      getch();      }

Đổi chuỗi chữ hoa thành chuỗi chữ thường

– Hàm strlwr(): Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr().

Cú pháp: char *strlwr(char *s) 

Sao chép chuỗi

– Hàm strcpy(): Hàm này được dùng để sao chép toàn bộ nội dung của chuỗi nguồn vào chuỗi đích.

Cú pháp: char *strcpy(char *Des, const char *Source) 

Ví dụ: Viết chương trình cho phép chép toàn bộ chuỗi nguồn vào chuỗi đích.

#include #include  #include  void main()  {      char Chuoi[255],s[255];      printf("Nhap chuoi: ");     gets(Chuoi);      strcpy(s,Chuoi);      printf("Chuoi dich: ");     puts(s);      getch();      }

Sao chép một phần chuỗi

– Hàm strncpy(): Hàm này cho phép chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi đích.

Cú pháp: char *strncpy(char *Des, const char *Source, size_t n) 

Trích một phần chuỗi

Hàm strchr(): Để trích một chuỗi con của một chuỗi ký tự bắt đầu từ một ký tự được chỉ định trong chuỗi cho đến hết chuỗi, ta sử dụng hàm strchr().

Cú pháp :  char *strchr(const char *str, int c) 

Lưu ý :

  • Nếu ký tự đã chỉ định không có trong chuỗi, kết quả trả về là NULL ;
  • Kết quả trả về của hàm là một con trỏ, con trỏ này chỉ đến ký tự c được tìm thấy đầu tiên trong chuỗi str.

Tìm kiếm nội dung chuỗi

– Hàm strstr(): Hàm strstr() được sử dụng để tìm kiếm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1.

Cú pháp: char *strstr(const char *s1, const char *s2) 

Kết quả trả về của hàm là một con trỏ chỉ đến phần tử đầu tiên của chuỗi s1 có chứa chuỗi s2 hoặc giá trị NULL nếu chuỗi s2 không có trong chuỗi s1.

Ví dụ: Viết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ chuỗi “hoc”.

#include  #include  #include  void main()  {      char Chuoi[255],*s;      printf("Nhap chuoi: ");     gets(Chuoi);      s=strstr(Chuoi,"hoc");      printf("Chuoi trich ra: ");     puts(s);      getch();      }

So sánh chuỗi

  • Hàm strcmp(): Để so sánh hai chuỗi theo từng ký tự trong bảng mã Ascii, ta có thể sử dụng hàm strcmp().

Cú pháp: int strcmp(const char *s1, const char *s2) 

Hai chuỗi s1 và s2 được so sánh với nhau, kết quả trả về là một số nguyên (số này có được bằng cách lấy ký tự của s1 trừ ký tự của s2 tại vị trí đầu tiên xảy ra sự khác nhau).

  • Nếu kết quả là số âm, chuỗi s1 nhỏ hơn chuỗi s2;
  • Nếu kết quả là 0, hai chuỗi bằng nhau;
  • Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2.

So sánh chuỗi

– Hàm stricmp(): Hàm này thực hiện việc so sánh trong n ký tự đầu tiên của 2 chuỗi s1 và s2, giữa chữ thường và chữ hoa không phân biệt.

Cú pháp: int stricmp(const char *s1, const char *s2) 

Kết quả trả về tương tự như kết quả trả về của hàm strcmp()

Khởi tạo chuỗi

– Hàm memset(): Hàm này được sử dụng để đặt n ký tự đầu tiên của chuỗi là ký tự c.

Cú pháp: memset(char *Des, int c, size_t n) 

Đổi từ chuỗi ra số

hàm atoi(), atof(), atol() (trong stdlib.h): Để chuyển đổi chuỗi ra số, ta sử dụng các hàm trên.

Cú pháp :

int atoi(const char *s) : chuyển chuỗi thành số nguyên

long atol(const char *s) : chuyển chuỗi thành số nguyên dài

float atof(const char *s) : chuyển chuỗi thành số thực

Nếu chuyển đổi không thành công, kết quả trả về của các hàm là 0. Ngoài ra, thư viện string.h còn hỗ trợ các hàm xử lý chuỗi khác, ta có thể đọc thêm trong phần trợ giúp.

Các bài tập vận dụng

1.Xóa tất cả các khoảng trắng của xâu ký tự s

2.Đếm xem có bao nhiêu từ trong xâu s.  Xuất các từ trên các dòng liên tiếp.

3.Tìm từ có chiều dài dài nhất và in ra.

4.Trích ra n ký tự đầu tiên/cuối cùng/bắt đầu tại vị trí pos.

5.Tìm kiếm và thay thế xâu con trong xâu ký tự lớn

6.Viết chương trình nhập vào một xâu ký tự bất kỳ và xoá k ký tự của xâu ký tự bắt đầu từ vị trí thứ n.

8.Nhập xâu họ tên (không quá 40 kí tự), chuẩn hoá xâu đó (kí tự đầu từ viết hoa, các kí tự khác viết thường, các từ cách nhau 1 dấu cách)

9.Nhập 3 xâu s1, s2, s3 (không quá 40 kí tự), thay xâu s2 bằng s3 trong s1

10.Nhập xâu kí tự. Đưa xâu đó về dạng chuẩn (các từ cách nhau bởi 01 dấu cách, chữ cái đầu xâu viết hoa, các chữ còn lại viết thường,…)

Khóa học tham khảo:

1.Lập trình C/C++ cho các bạn từ 12-17 tuổi

2.Lập trình C/C++ cho các bạn từ 18 tuổi

Ngôn ngữ lập trìnhC hỗ trợ cho chúng ta khánhiều hàm để xử lý hay thao tác vớichuỗi. Các hàm này bạncó thể tìm thấy trong thư viện(tương ứng vớitập tin string.h trong thư mục INCLUDE đối với phiên bản BorlandC V3.1).

Xin được nhắc lại, để khai báo một chuỗi ta khai báo mảng ký tự một chiều, ví dụ câu lệnhchar str[20];sẽ tạo một chuỗi có tên str với kích thước tối đa là 20 ký tự. Còn để khai báo một mảng chuỗi thì ta khai báo một mảng ký tự hai chiều, chẳng hạn như câu lệnhchar arrstr[10][25];sẽ tạo một mảng gồm 10 chuỗi và mỗi chuỗi có tối đa 25 ký tự.

Một chuỗi "abc" chẳng hạn, thực ra sẽ có 4 ký tự 'a', 'b', 'c', và ký tự kết thúc chuỗi '\0'. Ký tự '\0' ứng với NULL.

Các ký tự đặc biệt thể hiện trong chuỗi:

\\ Gạch chéo ngược (xổ trái)
\" Nháy đôi (nháy kép)
\' Nháy đơn
\n Newline (line feed) - Xuống dòng
\r Carriage return
\b Backspace (Xóa lùi)
\t Horizontal tab (Tab ngang)
\f Form feed
\a Alert (bell) (Phát tiếng kêu thông báo)
\v Vertical tab (Tab dọc)
\? Question mark (dùng trong đồ họa 3 chiều)
\nnn Character with octal valuennn
\xhh Character with hexadecimal valuehh

Ba loại hàm có sẵn trong thư viện string.h:

  • các hàmmemthao tác với chuỗi ký tự tùy ý mà không liên quan đến ký tự rỗng;
  • các hàmstrthao tác với các chuỗi ký tự kết thúc bằng null;
  • các hàmstrnthao tác với chuỗi các ký tự không rỗng.

Dưới đây ta sẽ tìm hiểucác hàm xử lý chuỗi phổ biếntrong ngôn ngữ C.

1. strlen()

Hàm strlen() (string length) dùng để lấy kích thước chuỗi (làsố lượng ký tự của chuỗi).Kích thướccủa chuỗi thường được dùng trong cácvòng lặp lấy từng ký tự củachuỗi. Cú pháp của hàm là:

strlen(str);

, trong đó,strcó thể là một biến chuỗi hoặc một hằng chuỗi thì cũng đều được chấp nhận.

Chương trình dướiđây hiển thị nội dung của một chuỗi trong đó giữa các ký tự được đặt thêm một ký tự '*':

#include<stdio.h> #include<conio.h> #include<string.h> main() { char str[10] = "V1Study"; int i; /* truy xuất và hiển thị từng ký tự của chuỗi */ for(i = 0; i<strlen(str); i++) printf("%c * ", str[i]); return 0; }

Kết quả của chương trình trên được minh họa như sau:

V * 1 * S * t * u * d* y *

2. strcpy()

Hàm strcpy() (string copy) dùng để gán chuỗi cho chuỗi.

Ngôn ngữC không cho phép ta gán trực tiếp chuỗi cho chuỗi thông qua toán tử gán (=) vì chuỗi là mảng ký tự. Vì vậy, ta cần phải sử dụng hàm strcpy(). Hàm này có cú pháp như sau:

strcpy(str1, str2);

, trong đó,str1str2đều có thể là các biến chuỗi hoặc hằng chuỗi.

Hàm strcpy() sẽ gán giá trị của chuỗi str2 cho chuỗi str1, đồng thời hàmtrả về chuỗi str1.

Đoạn mãsau đây minh họa việc sử dụng hàm strcpy(). Nó thay đổi tên của một khách sạn và hiển thị tên mới.

#include<stdio.h> #include<conio.h> #include<string.h> main() { char tenkhachsan1[15] = "BLUE Hotel"; char tenkhachsan2[15] = "GREEN Hotel"; printf("Ten cu cua khach san la \"%s\"\n", tenkhachsan1); /* tiến hành thay đổi tên của khách sạn */ strcpy(tenkhachsan1, tenkhachsan2); /* sau đó hiển thị tên mới */ printf("Sau khi doi, khach san co ten la \"%s\"\n", tenkhachsan2); return 0; }

3. strcat()

Hàm strcat() (string concatenate)được sử dụng để nối hai chuỗi vào nhau. Cú pháp củahàm là:

strcat(str1, str2);

Hàm sẽ tiến hành nối chuỗi str2 vào sau chuỗi str1 vàtrả về nội dung của chuỗi str1 sau khi nối.

Chương trình sau đây nhận vào họ, đệmvà tên, sau đónối chúng với nhau và hiển thị ra họ tên đầy đủ.

#include<stdio.h> #include<conio.h> #include<string.h> main() { char ho[10]; //họ char dem[15]; //đệm char ten[10]; //tên char hovaten[35]=""; printf("\nMoi nhap ho: "); /* nhập họ */ gets(ho); /* tiến hành nối họ và chuỗi chứa họ và tên */ strcat(hovaten, ho); printf("\nNhap vao dem: "); /* nhập đệm */ gets(dem); /* đưa thêm dấu cách */ strcat(hovaten, " "); /* rồi đưa đệm vào */ strcat(hovaten, dem); printf("\nXin moi nhap ten cua ban: "); /* cuối cùng nhập vào tên*/ gets(ten); strcat(hovaten, " "); /* rồi đưa tên vào */ strcart(hovaten, ten); /* và hiển thị ra màn hình họ và tên đầy đủ */ printf("\nHo va ten cua ban la: \"%s\"", hovaten); return 0; }

4. strchr()

Hàm strchr() (string character) dùng để tìm kiếm ký tự trong chuỗi.Cú pháp củahàm là:

strchr(str, chr);

, trong đó,chrcó thể là một biến ký tự hoặc một hằng ký tự đều được.

Quy cách hoạt động của hàm này là nó sẽ tìm xem trong chuỗi str có ký tự chr hay không, nếu có thì hàm trả về chuỗibắt đầu từ vị trí đầu tiên tìm thấy ký tựchrcho đến hết chuỗistr, ngược lại thì hàm trả vềNULL.

Chương trình sau đây xác định liệu ký tự 'a' có xuất hiện trong tên hai thành phố hay không.

#include<stdio.h> #include<conio.h> #include<string.h> main() { char str1[15] = "Ha Noi"; char str2[30] = "Thanh pho Ho Chi Minh"; char chr = 'a'; clrscr(); /* nếu khác NULL tức là tìm thấy chr trong str1 */ if(strchr(str1, chr) != NULL){ /* thì in ra ra thông báo có xuất hiện */ printf("\n'%c' co xuat hien trong chuoi \"%s\"\n",chr,str1); } else{ /* nếu không thì thông báo không xuất hiện */ printf("\n'%c' khong xuat hien trong chuoi \"%s\"\n",chr,str1); } /* kiểm tra xem 'a' có nằm trong chuỗi thứ hai không */ if(strchr(str2, chr) != NULL) { printf("\n'%c' xuat hien trong \"%s\"\n",chr,str2); } else{ printf("\n'%c' khong xuat hien trong \"%s\"\n",chr,str2); } return 0; }

5. strstr()

Hàm strstr() (string string) dùng để tìm kiếm chuỗi trong chuỗi.Cú pháp của hàm là:

strstr(Chuỗi1, Chuỗi2)//tìm Chuỗi2 trong Chuỗi1

, trong đó nếu không tìm thấyChuỗi2trongChuỗi1thìhàm trả về giá trị NULL.Ngược lại, hàm sẽ trả về một chuỗi bắt đầu từ vị trí đầu tiên tìm thấyChuỗi2cho đến hếtChuỗi1.Ví dụ:

//khai báo các chuỗi char s1[10] = "abcdefghi", s2[5] = "cde", s3[5] = "cdf"; strstr(s1, s2); //sẽ tìm chuỗi s2 trong chuỗi s1, hàm trả về kết quả là: "cdefghi" strstr(s1, s3); //sẽ tìm chuỗi s3 trong chuỗi s1, hàm trả về kết quả là NULL vì trong chuỗi s1 không có chuỗi "cdf"

6. strcmp()

Hàm strcmp() (string compare) dùng để so sánh hai chuỗi với nhautheo tiêu chí so sánhlàthứ tự ký tự trong bảng mã ASCII.Hàm này thường hay được dùng để sắp xếp các chuỗi theo chiều tăng hoặc giảm theo vần A B C, ví dụ như sắp xếp các tên sinh viên, các tên môn học theo trật tự tăng hoặc giảm.Cú pháp sử dụng hàm này là như sau:

strcmp(s1, s2)

Hàm sẽ trả về một số chính là hiệu của hai ký tự cuối cùng đem so sánh. Cụ thể hàm sẽ trả về giá trị theo các trường hợp sau:

- mộtsốâm (<0) nếu chuỗis1nhỏ hơn chuỗis2.

- số0 (==0) nếu chuỗis1giống hệt chuỗis2.

- một sốdương (>0) nếu chuỗis1lớn hơn chuỗis2.

Quy cách so sánh:

Việc so sánh sẽ bắt đầu từ hai ký tự đầu tiên bên trái của hai chuỗi.Bắt đầu từ bên trái, hàm sẽ lấy từng ký tự của chuỗis2đem so sánh với ký tự ở vị trí tương ứng của chuỗis1.Nếu hai ký tự đem so sánh giống nhau thì sẽ chuyển sang so sánh hai ký tự kế tiếp bên phải.Nếu hai ký tự khác nhau thì lập tức dừng lại và đưa ra kết quả: ký tự nào có thứ tự trong bảng mã ASCII lớn hơn thì chuỗi tương ứng sẽ lớn hơn chuỗi kia.

Chẳng hạn:

Chuỗi "abc" nhỏ hơn chuỗi "abd", vì ký tự 'd' có vị trí lơn hơn ký tự 'c' trong bảng mã ASCII.

Chuỗi "abc" nhỏ hơn chuỗi "abcd".

Chuỗi "An" nhỏ hơn chuỗi "Anh", chuỗi "Anh" nhỏ hơn chuỗi "Binh", ...

Ví dụ:

char s1[5]="Phan", s2[5]="Phi", s3[5]="Phan", s4[7]="Nhuong"; strcmp(s1,s2); //sẽ so sánh s2 với s1, hàm sẽ trả về một số âm (<0) strcmp(s1,s3); //hàm trả về 0 strcmp(s1,s4); //hàm trả về một số dương (>0)

Chương trình sau đây so sánh biếnname1với các biếnname2,name3,name4và hiển thị kết quả của phép so sánh:

#include<stdio.h> #include<conio.h> #include<string.h> main() { char str1[15] = "Ha Noi"; char str2[15] = "Da Nang"; char str3[15] = "Sai Gon"; char str4[15] = "Ha Noi"; int sosanh; sosanh = strcmp(str1,str2); printf("\n\"%s\" so sanh voi \"%s\" thi tra ve %d\n", str1, str2, sosanh); sosanh = strcmp(str1, str3); printf("\n\"%s\" so sanh voi \"%s\" thi tra ve %d\n", str1, str3, sosanh); sosanh = strcmp(str1,str4); printf("\n\"%s\" so sanh voi \"%s\" thi tra ve %d\n", str1, str4, sosanh); return 0; }

7. strrev()

Hàm strrev() (string reverse) dùng để đảo ngược trật tự một chuỗi. Hàm trả về chuỗi đã đượcđổi ngược.Cú pháp của hàm là:

strrev(Chuỗi)

Ví dụ, nếu bạn thực hiện lệnhstrrev("Lap trinh vien");, thì kết quả là chuỗisẽ đảo ngượcthành "neiv hnirt paL".

8. strlwr()

Hàm strlwr() (string lowercase) dùng để chuyểncác ký tự từ 'A' đến 'Z' trong một chuỗi thành in thường, các ký tự khác không thay đổi.

Ví dụ, câu lệnhstrlwr("ABC");sẽ chuyển chuỗi "ABC" thành "abc".

9. strupr()

Hàm strlupr() (string uppercase) dùng để chuyển các ký tự từ 'a' đến 'z' trong một chuỗi thành in HOA, các ký tự khác không thay đổi.

Ví dụ, lệnhstrupr("vietnam");sẽ chuyển chuỗi "vietnam"thành chuỗi"VIETNAM".

10. strncat()

Hàm này dùng để nối n ký tự của chuỗi sau vào sau chuỗi trước. Cú pháp của hàm như sau:

strncat(s1, s2, n)

Theo đó, hàm sẽ nối n ký tự của chuỗi s2 vào sau chuỗi s1.

Ví dụ:

#include<stdio.h> #include<string.h> main(){ char s1[]="abcd"; char s2[]="1234"; strncat(s1, s2, 2); puts(s1);//Kết quả là: abcd12 return 0; }

11. strncmp()

Hàm này dùng để so sánh n ký tự đầu tiên của hai chuỗi. Cú pháp như sau:

strncmp(s1, s2, n)

Theo đó, hàm sẽ so sánh n ký tự đầu củahai chuỗi s1 và s2 theo quy cách so sánh giống như hàmstrcmp().

Ví dụ:

#include<stdio.h> #include<string.h> main(){ char s1[]="abcd"; char s2[]="abde"; printf("%d",strncmp(s1, s2, 2)); //So sánh 2 ký tự đầu của 2 chuỗi, sẽ trả về 0 return 0; }

12. strncpy()

Cú pháp:

strncpy(s1, s2, n)

Hàm này dùng để gán n ký tự đầu tiên của chuỗi s2 cho n ký tự đầu tiên của chuỗi s1.

Ví dụ:

#include<stdio.h> #include<string.h> main(){ char s1[]="abcd"; char s2[]="1234"; strncpy(s1, s2, 2); //gán 2 ký tự đầu tiên của s2 cho 2 ký tự đầu tiên của s1 puts(s1);//Kết quả của s1: 12cd return 0; }

Bạn cũngtham khảo thêmvideo hướng dẫn dưới đây:


Tham khảo thêm về chuỗi

  • Bài tập phần chuỗi
  • Bài tập phần mảng chuỗi
  • Kiểm tra tính đối xứng của 1 chuỗi
  • Kiểm tra chuỗi có chứa ký tựinhoa không
  • Kiểm tra chuỗi có chứa kýsố không
  • Đếm số từ trong chuỗi
  • Cắt ký tự trắng (space) cuối chuỗi
  • Cắt ký tự trắng ở đầu chuỗi
  • Đếm số lần xuất hiện từng ký tự trong chuỗi
  • Cắt ký tự trắng thừa ở giữa chuỗi