STDIO
Tìm kiếm gần đây

    Nội dung

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

    Rye Nguyen

    28/07/2015
    Thao Tác Với Chuỗi Trong C/C++
    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. Bài viết này sẽ giúp các bạn có được những kiến thức cơ bản trong thao tác xử lý chuỗi trong ngôn ngữ C.

    Giới thiệu

    Chuỗi là một kiểu dữ liệu có mặt trên tất cả các ngôn ngữ lập trình. Vì thế việc thành thạo trong việc xử lý chuỗi là rất quan trọng đối với các lập trình viên. Bài viết này sẽ giúp các bạn có được những kiến thức cơ bản trong thao tác xử lý chuỗi trong ngôn ngữ C.

    Tiền đề bài viết

    Trong quá trình học tập và làm việc, tôi đã thao tác với chuỗi rất nhiều, và nó ít nhiều đã gây khó khăn cho tôi vì kiến thức về chuỗi chưa tốt. Tôi đã tham khảo khá nhiều nguồn tài liệu khác nhau để có hướng giải quyết cho những vấn đề mà tôi thường gặp nên đã không còn cảm thấy khó khăn như trước nữa. Bài viết này được đúc kết từ những kinh nghiệm mà tôi có được. Qua bài viết, tôi mong muốn sẽ giúp được các bạn phần nào những vấn đề thường gặp trong việc xử lý chuỗi, từ đó đạt được hiệu quả trong công việc.

    Đối tượng hướng đến

    Bài viết hướng đến các lập trình viên đang học lập trình căn bản và muốn tìm hiểu và khắc phục những vấn đề thường gặp về chuỗi trong C. Các đối tượng khác có thể đọc bài ở mức độ tham khảo.

    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, chúng ta 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, ta 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 đó, ngôn ngữ C cung cấp cho chúng ta 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ác bạn cần include thêm thư viện <stdio.h> (Xem thêm Nhập Xuất Cơ Bản Trong C :: www.stdio.vn/articles/read/14-nhap-xuat-co-ban-trong-c).

    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ác bạn 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, ta 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 bạn nhấn phím Enter.

    Trôi dòng lệnh

    Tôi đã từng đề cập đến vấn đề này trong bài viết Nhập Xuất Cơ Bản Trong C :: www.stdio.vn/articles/read/14-nhap-xuat-co-ban-trong-c. 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". Tôi nhớ mãi câu nói này của người thầy của tôi. Việc không huỷ vùng nhớ sẽ không để lại "dấu vết" gì cho các bạn 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 của bạn. Do đó các bạn 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.

    Thảo luận

    In order to comment you must be a STDIO Insider. Please sign up or log in to continue.

    Đăng nhập

    Bài viết liên quan

    GameObject - Thao Tác Với C# Script

    GameObject - Thao Tác Với C# Script

    GameObject là một khái niệm cơ bản trong Unity. Mọi đối tượng trong game được hiển thị trong cửa sổ Hierarchy đều là các GameObject. Các loại đối tượng khác nhau sẽ có ...

    Rye Nguyen

    08/08/2015

    Thao Tác Với MySQL Database Sử Dụng MySQLi Extension Trong PHP

    Thao Tác Với MySQL Database Sử Dụng MySQLi Extension Trong PHP

    Việc thao tác với database trong quá trình phát triển và bảo trì website là công việc thường xuyên đối với những lập trình viên. Với mỗi database được tích hợp trong ...

    Nguyễn Nghĩa

    07/11/2015

    Thao Tác Âm Thanh Trong C# Qua Thư Viện WMPLib

    Thao Tác Âm Thanh Trong C# Qua Thư Viện WMPLib

    Trong lập trình ứng dụng hoặc games với C# các bạn thường gặp vấn đề về việc thao tác với âm thanh. Bài viết này sẽ hướng dẫn các bạn thao tác âm thanh với thư viện ...

    Vothanhvu

    01/06/2017

    Thao Tác Với Tài Liệu PDF Sử Dụng Thư Viện iTextSharp Trong C#

    Thao Tác Với Tài Liệu PDF Sử Dụng Thư Viện iTextSharp Trong C#

    Trong quá trình làm project chúng ta cần phải export thông tin cần thiết ra tài liệu PDF. Việc thao tác với tài liệu này không phải là dễ dàng vì cấu trúc phức tạp của ...

    Nguyễn Nghĩa

    16/10/2015

    Thao Tác Với XML Sử Dụng TinyXML Trong C++

    Thao Tác Với XML Sử Dụng TinyXML Trong C++

    Không thể phủ nhận được vai trò của XML trong quá trình phát triển ứng dụng. Thông thường được dùng để tạo rss, kết quả trả về từ server, lưu trữ dữ liệu...Vậy trong quá ...

    Nguyễn Nghĩa

    21/10/2015

    Nhập Xuất Cơ Bản Trong C++

    Nhập Xuất Cơ Bản Trong C++

    Đối với mọi ngôn ngữ lập trình, thao tác nhập/xuất dữ liệu luôn là thao tác cơ bản và quan trọng mà mỗi lập trình viên cần nắm rõ. Bài viết này sẽ cung cấp kiến thức cơ ...

    Rye Nguyen

    03/08/2015

    Nhập Xuất Cơ Bản Trong C

    Nhập Xuất Cơ Bản Trong C

    Trong bất cứ một ngôn ngữ lập trình nào, việc tương tác trực tiếp với máy tính là rất quan trọng và cần thiết. Một chương trình được viết ra cần có khả năng nhận dữ liệu ...

    Rye Nguyen

    28/07/2015

    Type-casting Trong C++

    Type-casting Trong C++

    Chuyển đổi kiểu dữ liệu (type-casting) là một kỹ năng quan trọng trong lập trình C/C++. Một số bài toán phức tạp không thể giải được do dữ liệu không tương thích, qua quá ...

    Rye Nguyen

    30/07/2015

    Chuỗi Và Xử Lí Chuỗi Trong PHP

    Chuỗi Và Xử Lí Chuỗi Trong PHP

    Chuỗi trong PHP là một dãy các kí tự ASCII. Khác với C chuỗi trong PHP không có ký tự kết thúc, chiều dài của chuỗi không giới hạn,… Việc xử lí, làm việc với chuỗi trong ...

    Tran Khanh Nguyen

    22/03/2017

    std::string và Xử Lý Chuỗi trong C++

    std::string và Xử Lý Chuỗi trong C++

    Giới thiệu và hướng dẫn sử dụng thư viện std::string trong C++ xử lý chuỗi.

    Trương Diễm Hương

    15/08/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020