zoukankan      html  css  js  c++  java
  • 关于C语言字符串函数使用的一点心得

    就字符串的拼接函数为例strcat.

    原型:extern char *strcat(char *dest,char *src);
    用法:#include <string.h>

    功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'')并添加''。
    说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
            返回指向dest的指针。
      举例:

          // strcat.c
          #include <syslib.h>
          #include <string.h> 
    
          main()
          {
            char d[20]="Golden Global";
            char *s=" View";
            clrscr();
            strcat(d,s);
            printf("%s",d); 
    
            getchar();
            return 0;
          }
    

    上面的这段代码可以没有问题的输出 Golden Global View。

    但是这里有如果这样改呢:

          // strcat.c
          #include <syslib.h>
          #include <string.h> 
    
          main()
          {
            char *p="Golden Global";
            char *s=" View";
            clrscr();
            strcat(p,s);
            printf("%s",p); 
    
            getchar();
            return 0;
          }
    

    参数是符合它的要求2个指针参数的,但是这个程序却运行不了。开始百思不得其解,为什么参数的类型都正确但是传不回自己想要的结果。这样只能去看函数原型了。

    strcat函数原型

    char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数
    {
        char * address = strDest;             //该语句若放在assert之后,编译出错
        
        assert((strDest != NULL) && (strScr != NULL)); //对源地址和目的地址加非0断言
        
        while(*strDest)             //是while(*strDest!=’’)的简化形式
        {                        //若使用while(*strDest++),则会出错,因为++是不受循环
            strDest++;               //约束的。所以要在循环体内++;因为要是*strDest最后指
        }                        //向该字符串的结束标志’’。
    
        while(*strDest++ = *strScr++) //是while((*strDest++ = *strScr++)!=’’)的简化形式
        {
            NULL;                 //该循环条件内可以用++,
        }                          //此处可以加语句*strDest=’’;有无必要?
        
        return address;               //为了实现链式操作,将目的地址返回
    
    }
    

    从这句话就知道为什么了

    while(*strDest++ = *strScr++)

    {

        NULL;

    }

    如果strDest是一个指针,这里的 *strDest 就是取一个未知地址的值,这个是编译器不能容忍的。但是为什么当strDest是一个数组的时候可以呢,因为数组等于给它分配连续地址。申请到的安全地址当然可以使用了。当然我们也可以写一个传入真正的以指针为参数的字符串拼接函数,下面是我自己写的一个函数原型:

    char *strcatDemo2(char *str1, const char *str2) //将源字符串加const,表明其为输入参数
    
    {
        assert((str1 != NULL) &&(str2 != NULL));
        
        char *address = (char *)malloc((strlen(str1) + strlen(str2) + 1) *sizeof(char));
        
        char *des = address;
        
        assert(address != NULL);
        
        while(*str1)
        {
            *address = *str1;
            str1++;
            address++;
        }
        
        while(*str2)
        {
            *address = *str2;
            str2++;
            address++;
        }    
        
        *address = '';
        
        return des;
    }
    

    在这个里面给指针address 申请了空间来存放2个字符串的东西,注意,这里要多申请一个,因为字符串要求一个’’结尾。使用就这样使用了:

    int main(int argc, char *argv[])
    {
        char *p = "hello, ", *s = "world!";
        
        char *t = strcatDemo2(p, s);
        puts(t);
      
      system("PAUSE");    
      return 0;
    }
    

    上面写的那个就类似于C#里面字符串相加的功能了。

    其实大多数C语言里面的字符串都是,一个字符数组参数,一个字符指针参数来使用的。下面就是这些东西的原型,可以好好看下,避免以后犯错。

    strcat函数原型:

    char *strcat(char *strDest, const char *strScr) //将源字符串加const,表明其为输入参数
    
    {
    
           char * address = strDest;             //该语句若放在assert之后,编译出错
    
           assert((strDest != NULL) && (strScr != NULL)); //对源地址和目的地址加非0断言
    
           while(*strDest)             //是while(*strDest!=’’)的简化形式
    
           {                        //若使用while(*strDest++),则会出错,因为++是不受循环
    
                  strDest++;               //约束的。所以要在循环体内++;因为要是*strDest最后指
    
           }                        //向该字符串的结束标志’’。
    
           while(*strDest++ = *strScr++) //是while((*strDest++ = *strScr++)!=’’)的简化形式
    
           {
    
                  NULL;                 //该循环条件内可以用++,
    
           }                          //此处可以加语句*strDest=’’;有无必要?
    
    return address;               //为了实现链式操作,将目的地址返回
    
    }
    

    strcpy函数原型:

    char *strcpy(char *strDest, const char *strScr)
    
    {
    
           char *address=strDest;
    
           assert((strDest != NULL) && (strScr != NULL));
    
           while(*strScr)                   //是while(*strScr != ’’)的简化形式;
    
           {
    
                  *strDest++ = *strScr++;
    
           }
    
           *strDest = '';                       //当strScr字符串长度小于原strDest字符串长度
    
           return address;                      //时,如果没有改语句,就会出错了。
    
    }
    

    strcmp函数原型:

    int strcmp (const char *str1,const char *str2)
    
    {           
    
           int len = 0;
    
           assert((str1 != '') && (str2 != ''));
    
           while(*str1 && *str2 && (*str1 == *str2))
    
           {
    
                  str1++;
    
                  str2++;
    
           }
    
           return *str1-*str2;
    
    }
    

    strlen函数原型:

    int strlen(const char *str)
    
    {
    
        int len = 0;
    
           assert(str != NULL);
    
           while(*str++)
    
           {
    
                  len++;
    
           }
    
           return len;
    
    }
    
    伪python爱好者,正宗测试实践者。
  • 相关阅读:
    [openshift]openshfit OKD的安装
    [Docker]记一次使用jenkins将镜像文件推送到Harbor遇到的问题
    [k8s]创建Kubernetes的ssl/tls用户
    [k8s]ubuntu18 + Heketi + Glsuterfs的独立部署
    [k8s]kubernetes dashboard的安装
    [K8S]kubeadm国内镜像安装方式
    [K8S]污点调度
    [GO]解决golang.org/x/ 下包下载不下来的问题
    [GO]删除切片的某个值
    layui静态初始化渲染表单样式
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8544088.html
Copyright © 2011-2022 走看看