Search…

Thao Tác Với Chuỗi Trong C/C++

06/09/20203 min read
Kiến thức cơ bản trong thao tác xử lý chuỗi trong C++.

Chuỗi là gì

Khái niệm chuỗi ký tự do con người đặt ra để thuận tiện trong việc sử dụng. Có thể hiểu đơn giản, chuỗi là tập hợp các ký tự được lưu trữ liên tiếp trong vùng nhớ máy tính. Mỗi ký tự có kích thước 1 byte, do đó kích thước của chuỗi ký tự sẽ bằng tổng số các ký tự có mặt trong chuỗi.

Thực chất, chuỗi ký tự là một mảng dữ liệu (array), mỗi phần tử trong mảng có kích thước 1 byte. Do đó, chuỗi ký tự có đầy đủ các tính chất của một mảng dữ liệu. Ngoài ra, nó còn có nhiều đặc tính và phương thức riêng để thao tác được dễ dàng hơn.

Cách sử dụng

Để khai báo chuỗi, không cần include thêm bất cứ thư viện nào. Tuy nhiên, để thao tác với chuỗi, không thể xử lý từng phần tử trong mảng ký tự đã khai báo, vì sẽ rất mất thời gian và nhiều khả năng gây ra sai sót. Do đó, C/C++ cung cấp các function cần thiết để thao tác với chuỗi. Hầu hết các hàm này nằm trong thư viện <string.h>. Ngoài ra, nếu có thao tác nhập, xuất chuỗi, cần include thêm thư viện <stdio.h>.

Các bạn xem xét đoạn code sau để hiểu được cách thao tác với chuỗi:

#include <stdio.h>
#include <string.h>

int main()
{
    char a[10];
    gets(a);
    printf("%d", strlen(a));

    char *b = new char[10];
    strcpy(b, a);
    puts(b);
    delete[] b;

    return 0;
}

Một số hàm thao tác với chuỗi thường dùng được liệt kê trong bảng sau:

Tên hàm Chức năng
strlen Lấy độ dài chuỗi
strcpy Copy chuỗi sang vùng nhớ mới
strcmp So sánh hai chuỗi
strcat Nối chuỗi nguồn vào chuỗi đích
strstr Tìm chuỗi con trong chuỗi nguồn

Ngoài ra còn nhiều hàm khác không được liệt kê trong bảng này. Tuỳ theo nhu cầu sử dụng, có thể tìm hiểu và vận dụng vào việc học tập của mình.

Những vấn đề thường gặp

Nhập chuỗi có khoảng trắng

Hàm scanf trong C nhận diện khoảng trắng giống như ký tự xuống dòng \n, như một dấu hiệu để kết thúc chuỗi thu được từ bộ đệm stdin (khác với ký tự kết thúc chuỗi \0). Do đó, khi nhập dữ liệu có khoảng trắng, chẳng hạn như nhập họ tên, phần dữ liệu còn lại sau khoảng trắng sẽ bị giữ lại ở stdin và hàm scanf sẽ không nhận đủ lượng dữ liệu cần thiết.

Để nhập chuỗi có khoảng trắng, sử dụng hàm gets. Cú pháp của hàm như sau:

char* gets(char* str);

Hàm gets sẽ nhận khoảng trắng như một ký tự bình thường. Quá trình nhập sẽ kết thúc khi nhấn phím Enter.

Trôi dòng lệnh

Khi trên stdin còn dữ liệu phù hợp với yêu cầu (thông thường là ký tự \n của lần nhập dữ liệu trước), nó sẽ bỏ qua các hàm nhập dữ liệu và truyền dữ liệu còn lại đó cho các hàm.

Để không bị trôi các hàm nhập, cần xoá sạch bộ đệm stdin trước mỗi hàm nhập bằng dòng code fflush(stdin).

Quên huỷ vùng nhớ

"Có new là phải có delete". Việc không huỷ vùng nhớ sẽ không để lại "dấu vết" gì thấy được để khắc phục, nhưng nó sẽ gây ra lỗi memory leak (rò rỉ vùng nhớ). Vùng nhớ này sẽ không bị huỷ (vì không có một biến nào được phép quản lý vùng nhớ này nữa) cho đến khi mọi thứ có liên quan đến vùng nhớ này được giải phóng (ở đây là IDE). Khi làm việc với những project lớn, việc reset máy thường xuyên là điều khó chấp nhận được, vì nó sẽ làm chậm tiến độ công việc. Do đó hãy cẩn thận huỷ tất cả vùng nhớ được tạo ra bằng cấp phát động trước khi kết thúc chương trình.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.vn

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024