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

    Nội dung

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

    21/08/2015
    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 chia sẻ các khám phá của mình trong bài viết này.

    Giới thiệu

    Cách hiện thực hàm memcmp, memcpymemset. Các hàm này nhằm xử lý các dãy nhị phân trên bộ nhớ.

    Tiền đề bài viết

    Trong quá trình làm việc tôi có nghiên cứu qua các hàm memcmp, memcpymemset 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 chia sẻ các khám phá của mình trong bài viết này.

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

    Bài viết này hướng đến các bạn có hứng thú với low level.

    void*

    Hàm trả về kiểu void là một hàm rất quen thuộc nghĩa là không cần trả về giá trị, nếu hàm kiểu void trả về giá trị thì void* có thể nhận được giá tri của pointer thuộc bất cứ kiểu dữ liệu nào và sau đó gán ngược lại cho một pointer có kiểu dữ liệu khác mà không làm mất dữ liệu của các ô nhớ.

    memcmp - memcpy - memset

    Hàm memcmp()

    Hàm memcmp đây là hàm so sánh 2 mảng với nhau bằng các byte có cùng vị trí của 2 mảng. Chỉ cần 1 byte của mảng A[] lớn hơn byte của mảng B[] có cùng vị trí thì mảng A[] sẽ được xem là lớn hơn mảng B[].

    Cách so sánh và giá trị trả về.

    Ta có A[]B[]

    • Nếu A[] > B[], thì kết quả trả về là 1
    • Nếu A[] == B[], thì kết quả trả về là 0
    • Nếu A[] < B[], thì kết quả trả về là -1
    int memcmp(const void *pt1, const void *pt2, int n)
    {
    	char *s1, *s2;
    	s1 = pt1;
    	s2 = pt2;
    	for (int i = 0; i < n; i++)
    	{
    		if (s1[i] > s2[i])
    			return 1;
    		else if (s1[i] < s2[i])
    			return -1;
    	}
    	return 0;
    }
    
    void main()
    {
    	char A[5] = "StdiO";
    	char B[5] = "StdIo";
    	int x, n;
    	x = memcmp(A, B, n);
    }

    Trong hàm này số lượng byte so sánh là tham số n

    Từ code trên ta có

    • Nếu n = 3 thì x == 0"Std" = "Std".
    • Nếu n = 5 thì x == 1'i' > 'I'.

    LƯU Ý

    Vì hàm thao tác trên byte nên không có giới hạn về số lượng vì thế nếu chúng ta nhập n lớn hơn số byte có trong mảng thì kết quả có khả năng sai.

    Hàm memcpy()

    Hàm memcpy là hàm dùng để sao chép n byte của mảng B[] qua mảng A[].

    void* memcpy(void *pt1, const void *pt2, int n)
    {
    	char *s1, *s2;
    	s1 = pt1;
    	s2 = pt2;
    	for (int i = 0; i < n; i++)
    	{
    		s1[i] = s2[i];
    	}
    }
    
    void main()
    {
    	char A[10];
    	char B[5] = "Stdio";
    	int n = 5;
    	memcpy(A, B, n);
    }

    LƯU Ý

    Hàm memcpy cũng giống hàm memcmp là không quản lí được số lượng byte. Vì thế:

    Nếu mảng A[] nhỏ hơn mảng B[]n lớn hơn tổng số byte của mảng A[] thì mảng A[] sẽ bị tràn dữ liệu.

    Nếu n lớn hơn tổng số byte của mảng B[] thì mảng A[] sẽ nhận thêm những giá trị không xác định được.

    Hàm memset()

    Hàm memset là hàm gán 1 loại giá trị cho n byte của mảng.

    void* memset(void *pt1, int x, int n)
    {
    	char *s;
    	s = pt1;
    	for (int i = 0; i < n; i++)
    	{
    		s[i] = x;
    	}
    }
    
    void main()
    {
    	char A[10];
    	int val = 1;
    	int n = 10;
    	memcpy(A, val, n);
    }

    Nếu như code trên thì mảng A[10] == "1111111111".

    LƯU Ý

    Ta cho các kiểu khai báo sau

    // VÍ DỤ 1
    void main()
    {
    	short x[2];
    	int val = 1;
    	x[0] = val;
    	x[1] = val;
    }
    
    // VÍ DỤ 2
    void main()
    {
    	short x[2];
    	int val = 1;
    	int n = 2;
    	memset(x, val, n);
    	printf("%d", x[0]);
    }

    Cách gán biến của VÍ DỤ 1VÍ DỤ 2 hoàn toàn khác nhau:

    • VÍ DỤ 1 thì x[0] == x[1] == 1;
    • VÍ DỤ 2 thì hàm memset sẽ gán biến cho từng byte mà kiểu short gồm có 2 byte nên ta sẽ có x[0] == 257x[1] có giá trị không xác định.

    Vì thế để gán hết byte của mảng thì n phải bằng 4, và khi đó thì x[0] == x[1] == 257.

    Tham khảo

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

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

    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

    Nguyễn Minh Hiếu

    21/07/2015

    Sự Ra Đời Của Phương Thức Khởi Tạo (Constructor), Phương Thức Hủy (Destructor) Trong Một Class - C++  (Tiếp Theo)

    Sự Ra Đời Của Phương Thức Khởi Tạo (Constructor), Phương Thức Hủy (Destructor) Trong Một Class - C++ (Tiếp Theo)

    Để làm rõ hơn về phương thức khởi tạo và phương thức hủy, chỉ cần chỉ rõ hơn về nguồn gốc của nó sẽ giúp cho ta hiểu thấu đáo hơn và dễ sử dụng hơn trong quá trình lập ...

    La Kiến Vinh

    15/09/2014

    Ứng Dụng Của StartCoroutine Trong Unity

    Ứng Dụng Của StartCoroutine Trong Unity

    Khi tiếp nhận và xử lý các sự kiện thu được, có những lúc chúng ta cần một khoảng thời gian chờ giữa việc nhận được sự kiện và xử lý sự kiện. Có khá nhiều những trường ...

    Rye Nguyen

    08/08/2015

    Function Objects Hay Functor Với C++

    Function Objects Hay Functor Với C++

    Giới thiệu, cách sử dụng và ứng dụng Function Objects hay còn được gọi là Functor trong C++. Function Objects cũng khá lạ với điều này, function objects được hiện thực để ...

    La Kiến Vinh

    18/07/2014

    Tạo GUI Trong C++ Sử Dụng Qt

    Tạo GUI Trong C++ Sử Dụng Qt

    Tạo ứng dụng với giao diện đồ hoạ trong C++, sử dụng framework hỗ trợ Qt, tích hợp vào visual studio. Qt là ứng dụng đa nền tảng, dễ sử dụng khi cho phép kéo thả để tạo ...

    Kim Uyên

    12/05/2016

    Hiện Thực Quadtree Và Ứng Dụng Trong Lập Trình Game

    Hiện Thực Quadtree Và Ứng Dụng Trong Lập Trình Game

    Xét va chạm (Collision Detection) là một việc quan trọng trong lập trình game. Công việc này đòi hỏi chi phí cao, đặc biệt khi số lượng thực thể (entity) trong game là ...

    Rye Nguyen

    31/07/2015

    Đọ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

    Sử Dụng Mảng Trong C++

    Sử Dụng Mảng Trong C++

    Mảng dữ liệu là một tập hợp các phần tử có cùng kiểu dữ liệu và được truy cập thông qua index. Việc vận dụng mảng dữ liệu trong việc học tập và làm việc là điều không thể ...

    Rye Nguyen

    29/07/2015

    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

    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