zoukankan      html  css  js  c++  java
  • 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]
    ", ch, ret+1);
        }
        else
        {
            printf("not found [%c] in [%s]
    ", 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
    ", str1, str2);
        }
        else if (ret < 0)
        {
            printf("str1 < str2, str1: %s, str2: %s
    ", str1, str2);
        }
        else
        {
            printf("str1 == str2, str1: %s, str2: %s
    ", 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
    ", src, dest);
    
        char d[20];
        memcpy(d, src + 11, 5);// 从第 11 个字符开始复制,连续复制 5 个字符
      // 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char));
        d[5] = '';
        printf("%s
    ", 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
    ", dest, src);
        memmove(dest, src, 9);
        printf("After memmove(): dest = %s, src = %s
    ", 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
    ", str);
    
        memset(str, '$', 7);
        printf("after memset(): %s
    ", str);
    }
    
    
    int main()
    {
        printf("test_memchr():
    ");
        test_memchr();
    
        printf("
    test_memcmp():
    ");
        test_memcmp();
    
        printf("
    test_memcpy():
    ");
        test_memcpy();
    
        printf("
    test_memmove():
    ");
        test_memmove();
    
        printf("
    test_memset():
    ");
        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
    
  • 相关阅读:
    换教室
    [国家集训队]礼物
    【模板】扩展卢卡斯(学习笔记)
    Desert King
    绿豆蛙的归宿
    Dropping tests
    [SDOI2013]随机数生成器
    佳佳的fib
    [USACO10OPEN]水滑梯Water Slides
    强大的XML
  • 原文地址:https://www.cnblogs.com/liutongqing/p/13373746.html
Copyright © 2011-2022 走看看