Nhập xuất chuỗi trong c++

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\nNewline (line feed) - Xuống dòng\rCarriage return\bBackspace (Xóa lùi)\tHorizontal tab (Tab ngang)\fForm feed\aAlert (bell) (Phát tiếng kêu thông báo)\vVertical tab (Tab dọc)\?Question mark (dùng trong đồ họa 3 chiều)\nnnCharacter with octal value nnn\xhhCharacter with hexadecimal value hh

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

  • các hàm 
    #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 ca khách sn */
      strcpy(tenkhachsan1, tenkhachsan2);
      /* sau đó hin th tên mi */
      printf("Sau khi doi, khach san co ten la \"%s\"\n", tenkhachsan2);
      return 0;
    }
    0 thao tác với chuỗi ký tự tùy ý mà không liên quan đến ký tự rỗng;
  • các hàm 
    #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 ca khách sn */
      strcpy(tenkhachsan1, tenkhachsan2);
      /* sau đó hin th tên mi */
      printf("Sau khi doi, khach san co ten la \"%s\"\n", tenkhachsan2);
      return 0;
    }
    1 thao tác với các chuỗi ký tự kết thúc bằng null;
  • các hàm 
    #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 ca khách sn */
      strcpy(tenkhachsan1, tenkhachsan2);
      /* sau đó hin th tên mi */
      printf("Sau khi doi, khach san co ten la \"%s\"\n", tenkhachsan2);
      return 0;
    }
    2 thao tác với chuỗi các ký tự không rỗng.

Dưới đây ta sẽ tìm hiểu các hàm xử lý chuỗi phổ biến trong 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ước của chuỗi thường được dùng trong các vòng lặp lấy từng ký tự của chuỗi. Cú pháp của hàm là:

strlen(str);

, trong đó, str có 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 xut và hin th tng ký t ca chui */
  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 đó, str1 và str2 đề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àm trả 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 ca khách sn */
  strcpy(tenkhachsan1, tenkhachsan2);
  /* sau đó hin th tên mi */
  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ủa hà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ọ, đệm và 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: ");
  /* nhp h */
  gets(ho);
  /* tiến hành ni h và chui cha h và tên */
  strcat(hovaten, ho);
  printf("\nNhap vao dem: ");
  /* nhp đm */
  gets(dem);
  /* đưa thêm du cách */
  strcat(hovaten, " ");
  /* ri đưa đm vào */
  strcat(hovaten, dem);
  printf("\nXin moi nhap ten cua ban: ");
  /* cui cùng nhp vào tên*/
  gets(ten);
  strcat(hovaten, " ");
  /* ri đưa tên vào */
  strcart(hovaten, ten);
  /* và hin 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ủa hàm là:

strchr(str, chr);

, trong đó, chr có 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ỗi bắt đầu từ vị trí đầu tiên tìm thấy ký tự chr cho đến hết chuỗi str, 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 tc là tìm thy chr trong str1 */
  if(strchr(str1, chr) != NULL){
    /* thì in ra ra thông báo có xut hin */
    printf("\n'%c' co xuat hien trong chuoi \"%s\"\n",chr,str1);
  } else{ /* nếu không thì thông báo không xut hin */
    printf("\n'%c' khong xuat hien trong chuoi \"%s\"\n",chr,str1);
  }
  /* kim tra xem 'a' có nm trong chui 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ấy Chuỗi2 trong Chuỗi1 thì 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ấy Chuỗi2 cho đến hết Chuỗi1. Ví dụ:

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

6. strcmp()

Hàm strcmp() (string compare) dùng để so sánh hai chuỗi với nhau theo tiêu chí so sánh là 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ột số âm (<0) nếu chuỗi s1 nhỏ hơn chuỗi s2.

- số 0 (==0) nếu chuỗi s1 giống hệt chuỗi s2.

- một số dương (>0) nếu chuỗi s1 lớn hơn chuỗi s2.

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ỗi s2 đem so sánh với ký tự ở vị trí tương ứng của chuỗi s1. 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 vi s1, hàm s tr v mt s âm (<0)
strcmp(s1,s3); //hàm tr v 0
strcmp(s1,s4); //hàm tr v mt s dương (>0)

Chương trình sau đây so sánh biến name1 với các biến name2, name3, name4 và 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ệnh strrev("Lap trinh vien");, thì kết quả là chuỗi sẽ đảo ngược thành "neiv hnirt paL".

8. strlwr()

Hàm strlwr() (string lowercase) dùng để chuyển cá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ệnh strlwr("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.