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

    Nội dung

    Các Hàm memset() - memcpy() - memcmp() Trong C

    21/07/2015
    11/06/2016
    Các Hàm memset() - memcpy() - memcmp() Trong C
    Giới thiệu về các hàm thao tác trên bộ nhớ trong thư viện string.h

    Giới thiệu

    string.h là một thư viện khá quen thuộc trong C, trong đó có một số hàm thao tác tới vùng nhớ mà nhiều lập trình viên mới chưa biết tới.

    Tiền đề bài viết

    Trong quá trình học tập và nghiên cứu, khi tiếp xúc với chuỗi và thư viện string.h của C, tôi phát hiện ra một số hàm có thể thao tác trực tiếp tới vùng nhớ, vô cùng có ích mà không phải ai cũng biết đến. Tôi viết bài này để chia sẻ những điều tôi tìm hiểu được nhằm giúp người đọc có thể hiểu và áp dụng đúng các hàm này vào lập trình.

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

    Bất cứ ai đang học tập và nghiên cứu về ngôn ngữ lập trình C mà chưa biết hoặc chưa hiểu rõ về những hàm này. Những đối tượng khác có thể đọc để tham khảo và trao đổi nhằm giúp bài viết cải thiện hơn.

    Lời nói đầu

    Các hàm nói trên dù thuộc thư viện <string.h> nhưng đều có thể sử dụng để thao tác tới các vùng nhớ thuộc bất kì kiểu dữ liệu nào, tuy nhiên để cho bạn đọc dễ hiểu nhất, tác giả bài viết này sẽ sử dụng chuỗi để diễn đạt các ý tưởng.

    Bạn đọc có thể tham khảo bài viết Thao Tác Với Chuỗi Trong C/C++ của tác giả Rye Nguyễn để nắm bắt các thao tác cơ bản trước.

    memset()

    Cú pháp của hàm như sau:

    void * memset(void * ptr, int value, size_t num);

    Tác dụng của hàm là set num byte giá trị của vùng nhớ tính từ vị trí ptr trỏ tới bằng giá trị value

    Ví dụ:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char str[30] = "We are Stdio's Authors";
        printf("%s\n", str);
    
        memset(str + 3, '@', 10); // set 10 byte từ vị trí thứ 4 của str thành @
        printf("%s\n", str);
    
        return 0;
    }

    Kết quả in ra màn hình sẽ là:

    We are Stdio's Authors
    We @@@@@@@@@@s Authors

    Tuy memset() có công dụng khá hay, nhưng ít khi lập trình viên sử dụng đến, trừ trường hợp muốn set toàn bộ vùng nhớ thành 1 giá trị gì đó, thường là giá trị 0.

    memcpy()

    Cú pháp của hàm như sau:

    void * memcpy(void * destination, const void * source, size_t num);

    Tác dụng của hàm là sao chép num byte từ vị trí mà source trỏ tới đến vị trí mà destination trỏ tới

    Ta có ví dụ sau:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char str1[30] = "We are Stdio's Authors";
        char str2[30] = "World";
    
        memcpy(str1 + 2, str2, 5);
        printf("%s\n", str1);
    
        return 0;
    }

    Kết quả in ra màn hình như sau:

    WeWorldStdio's Authors

    Tác dụng của hàm này khác với strcpy(), strcpy() sao chép vùng nhớ từ vị trí mà source trỏ tới cho tới vị trí của kí tự ‘\0’ tới destination, do đó destination có giá trị chuỗi giống với source, còn với memcpy() thì việc sao chép như thế nào hoàn toàn do người dùng kiểm soát. Tùy trường hợp mà sử dụng 2 hàm này.

    memcmp()

    Cú pháp của hàm này như sau:

    int memcmp(const void * ptr1, const void * ptr2, size_t num);

    Tác dụng: so sánh giá trị các vùng nhớ mà ptr1 và ptr2 trỏ tới theo từng byte, sẽ dừng lại khi so sánh đủ num byte. Khác với strcmp() luôn dừng lại khi gặp kí tự ‘\0’.

    Giá trị trả về:

    • -1: Khi giá trị của byte đầu tiên không trùng của ptr1 nhỏ hơn ptr2.
    • 0: Khi giá trị của 2 vùng nhớ bằng nhau
    • 1: Khi giá trị của byte đầu tiên không trùng của ptr1 lớn hơn ptr2.

    Về độ lớn giá trị của các kí tự các bạn có thể tham khảo bài viết Bảng Mã ASCII của tác giả Hiếu Nguyễn.

    Lời kết

    Các thư viện chuẩn của C còn rất nhiều các phương thức hữu ích mà các lập trình viên có thể khai thác. Tác giả bài viết hi vọng những chia sẻ ở trên sẽ giúp ích cho các bạn, rất mong các bạn có những góp ý, cũng như chia sẻ để bài viết được hoàn thiện hơn.

    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

    Hiện Thực Và Sử Dụng Hàm memcmp - memcpy - memset Trong C/C++

    Hiện Thực Và Sử Dụng Hàm memcmp - memcpy - memset Trong C/C++

    Trong quá trình làm việc tôi có nghiên cứu qua các hàm memcmp, memcpy và memset dùng để thao tác trên byte, biết rằng những hàm này sẽ cần sử dụng thường xuyên, nên tôi ...

    Shiro Nguyễn

    21/08/2015

    Tư Duy Tối Ưu Hóa Trong Lập Trình Games - Phần 1: Codes Trong C/C++

    Tư Duy Tối Ưu Hóa Trong Lập Trình Games - Phần 1: Codes Trong C/C++

    Bài viết hướng tối ưu hóa trong lập trình với C++, tối ưu hóa lập trình C++ với games, bài viết hướng games bởi vì games đòi hỏi hiệu năng rất cao, và các games lớn thông ...

    La Kiến Vinh

    18/09/2014

    Con Trỏ Hàm Trong C/C++

    Con Trỏ Hàm Trong C/C++

    Tương tự Windows Form, trong những game được lập trình bằng C++ cũng có những Button, và để tạo ra chúng thì không đơn giản. Vì ngoài việc xử lý hình ảnh, ...

    Tuấn Trần

    18/08/2015

    template Trong C++

    template Trong C++

    Template là từ khóa trong C++, chúng ta có thể hiểu rằng là nó một kiểu dữ liệu trừu tượng, đặc trưng cho các kiểu dữ liệu cơ bản. Khi học về lập trình hướng đối tượng ...

    Trung Nguyễn

    21/09/2014

    Đọc Ghi File Cơ Bản Trong C#

    Đọc Ghi File Cơ Bản Trong C#

    Hướng dẫn đọc và ghi file cơ bản sử dụng đối tượng File trong C#. Nhờ có các hàm hỗ trợ nên các thao tác đọc ghi dữ liệu trên file trong C# được thực hiện một cách nhanh ...

    Bùi Trung Hiếu

    07/04/2016

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

    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 ...

    Rye Nguyen

    28/07/2015

    Một Số Hàm Hữu Ích Trong Thư Viện Algorithm C++ (STL)

    Một Số Hàm Hữu Ích Trong Thư Viện Algorithm C++ (STL)

    Việc vận dụng những thư viện hỗ trợ trong C++ rất quan trọng. Đặc biệt là sử dụng thư viện algorithm để hỗ trợ giải quyết những vấn đề một cách nhanh chóng thay vì phải ...

    Phạm Tấn Phong

    02/03/2016

    Xây Dựng Hàm Có Tham Số Tuỳ Ý Trong C

    Xây Dựng Hàm Có Tham Số Tuỳ Ý Trong C

    Trong một số trường hợp, chúng ta cần truyền vào hàm một vài tham số mà chưa biết trước được số lượng. Giải pháp thông thường là đưa các phần tử đó vào một mảng hoặc một ...

    Rye Nguyen

    03/08/2015

    9 Tính Năng Quan Trọng Trong C++11

    9 Tính Năng Quan Trọng Trong C++11

    C++11 là một phiên bản cải tiến và nâng cấp từ C++98 (hay các bạn vẫn gọi là C++), với những tính năng mới tối ưu hơn, dễ sử dụng hơn, dễ quản lý bộ nhớ hơn, và khắc phục ...

    Lê Minh Tài

    13/08/2015

    Hiện Thực Và Sử Dụng Hàm strcmp - strcpy - strlen Trong C/C++

    Hiện Thực Và Sử Dụng Hàm strcmp - strcpy - strlen Trong C/C++

    Hướng dẫn sử dụng hàm strlen để lấy độ dài chuỗi, hàm strcmp để so sánh hai chuỗi, hàm strcpy để copy chuỗi trong C.

    Shiro Nguyễn

    21/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