当前位置:  编程技术>c/c++/嵌入式

基于C语言字符串函数的一些使用心得

    来源: 互联网  发布时间:2014-10-18

    本文导语:  就字符串的拼接函数为例strcat.原型:extern char *strcat(char *dest,char *src);用法:#include 功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'')并添加''。说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src...

就字符串的拼接函数为例strcat.
原型:extern char *strcat(char *dest,char *src);
用法:#include
功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'')并添加''。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
      返回指向dest的指针。
举例:

代码如下:

// strcat.c
      #include
      #include
      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
      #include
      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;
}

    
 
 

您可能感兴趣的文章:

  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • C语言字符串库 AString
  • c语言 字符串函数 子串
  • C语言字符串处理库 cstring
  • C语言中的字符串拼接问题,怎么得不到我想要的字符串?
  • C语言字符串函数库 Strfunc
  • c语言有什么简单办法判断一个字符串是否是合法日期?
  • C语言实现输入一个字符串后打印出该字符串中字符的所有排列
  • c语言中如何通过日期时间字符串得到时间戳?
  • 如何用C语言去除字符串两边的空字符
  • Linux下C语言怎么把长整型转换为字符串
  • Linux下的C语言字符串和字符有几种类型?和Windows下区别是不是很大?
  • linux下c语言字符串数据类型的问题!
  • c语言 字符串转大写的简单实例
  • Linux c语言 如何统计utf-8编码的包含中英文和各种符号的字符串中各个字符的个数
  • c语言中用字符串数组显示菜单的解决方法
  • C语言字符串原地压缩实现方法
  • C语言中字符串和数字的相互转换实现代码
  • c语言中time_t类型是一个长整型,java中的字符串"YYYY-MM-DD HH:MM:SS"怎么转换为这个长整型?
  • 用c语言根据可变参数合成字符串的实现代码
  • 非常着急,关于DES加密的,用java加密过的字符串,药用Linux下的C语言来解密,涉及到补位的问题,弄了几天都没有实现,有高手会的,请指点一二!!!!!!!!
  • java 的条件判断函数(类似于别的语言iif函数)
  • Unix系统函数和C语言标准函数库有重叠的部分吗?
  • c语言也能重载函数? 怎么解释。unix编程的open函数。
  • SAC函数式编程语言
  • 我在c语言下建立一个函数,难道不能在函数名称前加 void 么?
  • 在Unix下C语言中的SignalInit函数怎么用
  • Linux添加系统调用时如何调用C语言库函数
  • C语言中函数声明与调用问题
  • C语言哈希函数库 murmur3
  • 常用C语言函数库 libasn
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • HTML语言特殊字符大全及其编码对照表(包括转义方式)
  • 改变redhat的系统语言/字符集
  • 关于ubuntu字符界面系统console显示多国语言
  • 如何改变redhat的系统语言/字符集
  • 各位大虾:请问UNIX环境下C语言函数memcpy拷贝的字符的长度有没有限制,若有,能不能修改,怎么修改?
  • c语言标准库中字符转换函数和数字转换函数
  • 深入C语言把文件读入字符串以及将字符串写入文件的解决方法
  • Linux下C语言怎样从键盘读入一个十六进制字符数组
  • C语言中字符串常用函数strcat与strcpy的用法介绍
  • c语言中单引号和双引号的区别(顺利解决从字符串中提取IP地址的困惑)
  • c语言字符数组与字符串的使用详解
  • c语言输出字符串中最大对称子串长度的3种解决方案
  • 编程技术其它 iis7站长之家
  • C语言实现字符串匹配KMP算法
  • ubuntu下初学用C语言实现find,好像有字符的问题
  • C语言字符串操作总结大全(超详细)
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • c语言判断某一年是否为闰年的各种实现程序代码
  • C语言中间语言 CIL
  • PHP编程语言介绍及安装测试方法
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • c语言实现MD5算法完整代码示例
  • 动态编程语言 LIME编程语言
  • 以NetBeans IDE为例介绍如何使用XML中Schema语言
  • C语言如何改变当前语言环境
  • c语言基于libpcap实现一个抓包程序过程


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3