openplanning

Hướng dẫn và ví dụ C/C++ string

  1. C-Style String
  2. C++ Style String

1. C-Style String

C-style String
Trong C++ có hai loại chuỗi (string), chuỗi theo phong cách của C (C-style string), và chuỗi theo phong cách của C++ (C++-Style string).
C-Style string thực sự là một mảng các ký tự, nhưng có một số hàm khác nhau được sử dụng cho các chuỗi, ví dụ như thêm vào các chuỗi, tìm chiều dài của chuỗi, và các hàm kiểm tra phù hợp của string với một biểu thức chính quy (regular expression).
Định nghĩa của một chuỗi sẽ là cái gì đó chứa nhiều hơn một ký tự kết hợp với nhau. Ví dụ, "this" là một chuỗi. Tuy nhiên, một ký tự đơn lẻ không được coi là một chuỗi, mặc dù chúng được sử dụng giống như một chuỗi.
String thực chất là một mảng các ký tự. Sử dụng dấu nháy kép để dánh dấu một chuỗi chữ (string literals)
// Khai báo một string theo kiểu mảng. Với ký tự null ở cuối.
char mystring[] = { 't', 'h', 'i', 's', ' ', 'i', 's' ,' ', 't', 'e', 'x', 't', '\0'};

// Đây là một string literal
char mystring[] = "this is text'';
StringLiteralExample.cpp
#include <stdio.h>

int main() {

  // Khai báo một String (String literal).
  char s1[] = "What is this";

  // In ra nội dung của string.
  printf("Your string = %s", s1);

  fflush(stdout);

  return 0;
}
Kết quả chạy ví dụ:
  • char mystr[] = "what is this";
Đoạn string ở trên có 12 ký tự, để khai báo string đó trong C bạn cần khai báo một mảng ký tự có 13 phần tử, hãy nhớ rằng phần tử cuối cùng trong mảng là ký tự null (mã là '\0'), nó có ý nghĩa kết thúc của string. Ký tự cuối cùng này không có ý nghĩa trong chuỗi của bạn, nhưng nó cần thiết cho chương trình C, chẳng hạn con trỏ (pointer) trỏ tới một ví trí của string nó sẽ đứng ở vị trí ký tự đầu tiên, và muốn lấy ra nội dung của chuỗi, chương trình sẽ duyệt tiếp các phần tử tiếp theo cho tới khi bắt gặp ký tự null.
Trong tình huống bạn có một mảng các ký tự và trong đó có phần tử ký tự null không nằm ở cuối của mảng, hoặc có nhiều phần tử ký tự null ở trong mảng. Tuy nhiên C sẽ chỉ coi mảng này chứa một string, bao gồm các ký tự đầu tiên cho tới ký tự null đầu tiên trong mảng.
Ví dụ sau đây khai báo một mảng các ký tự có 100 phần tử dùng để lưu trữ đoạn text do người dùng nhập vào từ bàn phím. Trong tình huống này các ký tự của chuỗi nhập vào sẽ được gán cho các phần tử đầu tiên của mảng và sau đó là ký tự null. Và các phần tử tiếp theo có thể không được gán.
StringFromKeyboardExample.cpp
#include <stdio.h>

int main() {

  // Khai báo 1 mảng ký tự có 100 phần tử
  // dùng để lưu trữ string người dùng nhập vào từ bàn phím.
  char s1[100];

  printf("Enter your string: \n");
  fflush(stdout);

  // Hàm scanf chờ đợi người dùng nhập vào.
  // Nó sẽ quét string (định dạng bởi %s) và truyền vào biến s1.
  // Chú ý định dạng %s sẽ quét lấy đoạn string đầu tiên không chứa khoảng trắng.
  scanf("%s", s1);

  printf("Your string = %s", s1);

  fflush(stdout);

  return 0;
}
Kết quả chạy ví dụ:
Các hàm cho C-style String
C cung cấp một số hàm để làm việc với String. Nó nằm trong thư viện chuẩn <string.h>. Dưới đây tôi liệt kê một vài hàm thông dụng của C liên quan string (không phải là tất cả).

Bạn có thể tìm hiểu tại liệu về các hàm tiêu chuẩn của C tại:

  • TODO
Một số hàm cho String.
Tên hàm
Mô tả
size_t strlen(const char *str)
Tính toán độ dài của chuỗi, không tính ký tự kết thúc (ký tự null)
char *strcpy(char *dest, const char *src)
Copy string 'src' sang cho 'dest'.
int strcmp(const char *str1, const char *str2)
So sánh hai string cho bởi tham số con trỏ str1, và str2. Nó trả về một số nguyên > 0 nghĩa là str1 > str2. Và = 0 nghĩa là 2 chuỗi giống nhau, ngược lại str1 < str2.
char *strcat(char *dest, const char *src)
Appends the string pointed to by src to the end of the string pointed to by dest.
char *strchr(const char *str, int c)
Searches for the first occurrence of the character c (an unsigned char) in the string pointed to by the argument str.
StringFunctionsExample.cpp
#include <stdio.h>

// Khai báo sử dụng thư viện string.h
#include <string.h>

int main() {

   // Khai báo một String (String literal).
   char s1[] = "This is ";

   // Khai báo một string theo kiểu khai báo mảng
   // Với phần tử null ở cuối.
   char s2[] = { 't', 'e', 'x', 't', '\0' };

   // Hàm: size_t strlen(const char *str)
   // Sử dụng hàm strlen để kiểm tra độ dài chuỗi.
   // size_t là kiểu dữ liệu số nguyên không dấu.
   size_t len1 = strlen(s1);
   size_t len2 = strlen(s2);

   printf("Length of s1 = %d \n", len1);
   printf("Length of s2 = %d \n", len2);

   // Khai báo một mảng ký tự có 100 phần tử
   // (100 phần tử là đủ dùng trong trường hợp này).
   char mystr[100];

   // Hàm: char *strcpy(char *dest, const char *src)
   // Copy string s1 vào mystr
   strcpy(mystr, s1);

   // Hàm: char *strcat(char *dest, const char *src)
   // Sử dụng hàm strcat để nối s2 vào mystr
   strcat(mystr, s2);

   // In ra nội dung của string.
   printf("Your string = %s", mystr);

   fflush(stdout);

   return 0;
}
Kết quả chạy ví dụ:

2. C++ Style String

C++ cung cấp cho bạn class string, nó giúp bạn làm việc dễ dàng hơn với các chuỗi. Các phương thức mà class string cung cấp vẫn hỗ trợ để làm việc với các C-Style string.
Khai báo thư viện string
Để sử dụng string bạn phải khai báo chỉ thị tiền sử lý (Preprocessor Directives) #include <string> và khai báo sử dụng không gian tên std.
// Khai báo chỉ thị tiền sử lý (Preprocessor Directives)

#include <string>

// Khai báo sử dụng không gian tên std.

using namespace std;
Khai báo string:
// Khai báo một string.

string mystring = "Hello World";

// Nếu bạn không khai báo sử dụng namespace std.
// Bạn phải sử dụng tên đầy đủ:

std::string mystring = "Hello World";
Các phương thức của String
Dưới đây là danh sách các phương thức của String.