C语言string.h中的memcpy(), memmove(), memset()等函数

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

//void* memchr(const void* str, int c, size_t n) 
//在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
//返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。
void test_memchr()
{
    const char str[] = "http://www.baidu.com";
    const char ch = 'a';
    char* ret;
    ret = (char*)memchr(str, ch, strlen(str));
    if (ret != NULL)
    {
        printf("[%c] 之后的字符串是 [%s]\n", ch, ret+1);
    }
    else
    {
        printf("not found [%c] in [%s]\n", ch, str);
    }
}

//int memcmp(const void* str1, const void* str2, size_t n)) 
//把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
//如果返回值 > 0,则表示 str1 大于 str2。
//如果返回值 = 0,则表示 str1 等于 str2。
//如果返回值 < 0,则表示 str1 小于 str2。
//ASCII:
//a - z: 97 - 122
//A - Z: 65 - 90
//0 - 9: 48 - 57
void test_memcmp()
{
    char str1[15];
    char str2[15];
    int ret;

    memcpy(str1, "abcdef", 6);
    memcpy(str2, "ABCDEF", 6);

    ret = memcmp(str1, str2, 5);

    if (ret > 0)
    {
        printf("str1 > str2, str1: %s, str2: %s\n", str1, str2);
    }
    else if (ret < 0)
    {
        printf("str1 < str2, str1: %s, str2: %s\n", str1, str2);
    }
    else
    {
        printf("str1 == str2, str1: %s, str2: %s\n", str1, str2);
    }

}

//void* memcpy(void* str1, const void* str2, size_t n) 
//从存储区 str2 复制 n 个字节到存储区 str1。
void test_memcpy()
{
    const char src[50] = "http://www.baidu.com";
    char dest[50];
    memcpy(dest, src, strlen(src) + 1);
    printf("src = %s, dest = %s\n", src, dest);

    char d[20];
    memcpy(d, src + 11, 5);// 从第 11 个字符开始复制,连续复制 5 个字符
  // 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char));
    d[5] = '\0';
    printf("%s\n", d);
}

//void* memmove(void* str1, const void* str2, size_t n) 
//从 str2 复制 n 个字符到 str1。
//若存在重叠内存块,memmove() 比 memcpy() 更安全。
//如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。
//如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
void test_memmove()
{
     char dest[] = "oldstring";
     char src[] = "newstring";

    printf("Before memmove(): dest = %s, src = %s\n", dest, src);
    memmove(dest, src, 9);
    printf("After memmove(): dest = %s, src = %s\n", dest, src);
}

//void* memset(void* str, int c, size_t n) 
//复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
void test_memset()
{
    char str[50];

    strcpy(str, "This is string.h library function");
    printf("before memset(): %s\n", str);

    memset(str, '$', 7);
    printf("after memset(): %s\n", str);
}


int main()
{
    printf("test_memchr():\n");
    test_memchr();

    printf("\ntest_memcmp():\n");
    test_memcmp();

    printf("\ntest_memcpy():\n");
    test_memcpy();

    printf("\ntest_memmove():\n");
    test_memmove();

    printf("\ntest_memset():\n");
    test_memset();
    return 0;
}

程序输出结果:

test_memchr():
[a] 之后的字符串是 [idu.com]

test_memcmp():
str1 > str2, str1: abcdef, str2: ABCDEF

test_memcpy():
src = http://www.baidu.com, dest = http://www.baidu.com
baidu
test_memmove():
Before memmove(): dest = oldstring, src = newstring
After memmove(): dest = newstring, src = newstring

test_memset():
before memset(): This is string.h library function
after memset(): $$$$$$$ string.h library function

猜你喜欢

转载自www.cnblogs.com/liutongqing/p/13373746.html