• Unix/Linux环境C编程入门教程(29) 内存操作那些事儿


    1. 函数介绍

    memccpy(拷贝内存内容)

    相关函数

    bcopy,memcpy,memmove,strcpy,strncpy

    表头文件

    #include<string.h>

    定义函数

    void * memccpy(void *dest, const void * src, int c,size_t n);

    函数说明

    memccpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。与memcpy()不同的是,memccpy()会在复制时检查参数c是否出现,若是则返回dest中值为c的下一个字节地址。

    返回值

    返回指向dest中值为c的下一个字节指针。返回值为0表示在src所指内存前n个字节中没有值为c的字节。

    范例

    #include<string.h>
    main()
    {
    char a[]="string[a]";
    char b[]="string(b)";
    memccpy(a,b,'B',sizeof(b));
    printf("memccpy():%s ",a);
    }

    执行

    memccpy():string(b)

       




    memchr(在某一内存范围中查找一特定字符)

    相关函数

    index,rindex,strchr,strpbrk,strrchr,strsep,strspn,strstr

    表头文件

    #include<string.h>

    定义函数

    void * memchr(const void *s,int c,size_t n);

    函数说明

    memchr()从头开始搜寻s所指的内存内容前n个字节,直到发现第一个值为c的字节,则返回指向该字节的指针。

    返回值

    如果找到指定的字节则返回该字节的指针,否则返回0。

    范例

    #include <string.h>
    main()
    {
    char *s="0123456789012345678901234567890";
    char *p;
    p=memchr(s,'5',10);
    printf("%s ",p);
    }

    执行

    5.68E+25

       




    memcmp(比较内存内容)

    相关函数

    bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp

    表头文件

    #include<string.h>

    定义函数

    int memcmp (const void *s1,const void *s2,size_t n);

    函数说明

    memcmp()用来比较s1和s2所指的内存区间前n个字符。字符串大小的比较是以ASCII码表上的顺序来决定,次顺序亦为字符的值。memcmp()首先将s1第一个字符值减去s2第一个字符的值,若差为0则再继续比较下个字符,若差值不为0则将差值返回。例如,字符串"Ac"和"ba"比较则会返回字符'A'(65)和'b'(98)的差值(-33)。

    返回值

    若参数s1和s2所指的内存内容都完全相同则返回0值。s1若大于s2则返回大于0的值。s1若小于s2则返回小于0的值。

    范例

    #include<string.h>
    main()
    {
    char *a ="aBcDeF";
    char *b="AbCdEf";
    char *c="aacdef";
    char *d="aBcDeF";
    printf("memcmp(a,b):%d ",memcmp((void*)a,(void*) b,6));
    printf("memcmp(a,c):%d ",memcmp((void*)a,(void*) c,6));
    printf("memcmp(a,d):%d ",memcmp((void*)a,(void*) d,6));

    执行

    memcmp(a,b):1 /*字符串a>字符串b,返回1*/
    memcmp(a,c):-1 /* 字符串a<字符串c,返回-1*/
    memcmp(a,d):0 /*字符串a=字符串d,返回0*/

       




    memcpy(拷贝内存内容)

    相关函数

    bcopy,memccpy,memcpy,memmove,strcpy,strncpy

    表头文件

    #include<string.h>

    定义函数

    void * memcpy (void * dest ,const void *src, size_t n);

    函数说明

    memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束''而结束。

    返回值

    返回指向dest的指针。

    附加说明

    指针src和dest所指的内存区域不可重叠。

    范例

    #include<string.h>
    main()
    {
    char a[30]="string (a)";
    char b[30]="stringstring";
    int i;
    strcpy(a,b);
    printf("strcpy():");
    for(i=0;i<30;i++)
    printf("%c",a[i]);
    memcpy(a,b,30);
    printf(" memcpy() :");
    for(i=0;i<30;i++)
    printf("%c",a[i]);
    }

    执行

    strcpy() : string a )
    memcpy() : string string

       




    memmove(拷贝内存内容)

    相关函数

    bcopy,memccpy,memcpy,strcpy,strncpy

    表头文件

    #include<string.h>

    定义函数

    void * memmove(void *dest,const void *src,size_t n);

    函数说明

    memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。

    返回值

    返回指向dest的指针。

    附加说明

    指针src和dest所指的内存区域可以重叠。

    范例

    参考memcpy()。

       




    memset(将一段内存空间填入某值)

    相关函数

    bzero,swab

    表头文件

    #include<string.h>

    定义函数

    void * memset (void *s ,int c, size_t n);

    函数说明

    memset()会将参数s所指的内存区域前n个字节以参数c填入,然后返回指向s的指针。在编写程序时,若需要将某一数组作初始化,memset()会相当方便。

    返回值

    返回指向s的指针。

    附加说明

    参数c虽声明为int, 但必须是unsigned char ,所以范围在0到255之间。

    范例

    #include <string.h>
    main()
    {
    char s[30];
    memset (s,'A',sizeof(s));
    s[30]='';
    printf("%s ",s);
    }

    执行

    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

    1. 小试

      流程设置:

      源代码实现:

      #include <stdio.h>
      #include <ctype.h>
      #include <string.h>
      #include <stdlib.h>
       
      int main(void)
      {    
      // //作为输入缓冲区
      char buffer[32];
       
      long int res;
       
      //分配两指针 后面利用这两个指针进行遍历操作
      char *q,*r;
      //malloc先分配一段内存p
      char *p = (char *)malloc(10*sizeof(char));
      printf("申请内存成功
      请输入带有数字的字符串
      ");
      scanf("%s",buffer);
       
      //memset清零
      memset(p,0,10);
      printf("memset清零
      ");
       
      //memcpy 拷贝我们输入缓冲区的数字字符进p
      q = p;
      r = buffer;
      while(r || q)
          {
      if(*r == '' )
      break;
      if(isdigit(*r)) //isdigit(测试字符是否为阿拉伯数字)
              {    
                  //void * memmove(void *dest,const void *src,size_t n);
                  memcpy(q,r,sizeof(char));
      printf("找到了一个字符并拷贝了
      ");
      q++;
              }
      r++;
          }
      //atol转化成一个长整形数 并输出 long atol(const char *nptr);
          res = atol(p);
      printf("转化后的数字是%ld 
      ",res);
       
      free(p);
      printf("释放内存成功
      ");
      return 0;
      }


    查找一下atol的头文件

    1. 各平台的运行情况

      在RHEL7上

      在RHEL6上

      在Solaris11上

      在mac上

  • 相关阅读:
    10 个迅速提升你 Git 水平的提示
    GitLab-CI与GitLab-Runner
    WEB应用安全解决方案测试验证
    sparse representation 与sparse coding 的区别的观点
    The Ph.D. Grind
    Potential Pythonic Pitfalls
    Overfitting & Regularization
    LVM的一般操作过程
    你跟大牛之间仅仅差一个google
    Hadoop伪分布式模式部署
  • 原文地址:https://www.cnblogs.com/new0801/p/6177060.html
Copyright © 2020-2023  润新知