4.3、字符串

来源:互联网 发布:淘宝如何申请二次售后 编辑:程序博客网 时间:2024/05/21 10:23
1、从概念上讲,C语言中没有字符串数据类型
   在C语言中使用字符数组来模拟字符串
   C语言中的字符串是以'\0'结束的字符数组
   C语言中的字符串可以分配于栈空间、堆空间或者只读存储区

2、
   char* s3 = "Hello";                         分配在只读存储区,值不能被改变
   char s1[] = {'H', 'e', 'l', 'l', 'o', '\0'};分配在栈区
   char* s2 = (char*)malloc(6*sizeof(char));   分配在堆区

3、
   字符串的长度就是字符串所包含字符的个数
   C语言中的字符串长度指的是第一个'\0'字符前出现的字符个数
   C语言中通过'\0'结束符来确定字符串的长度

4、字符串长度
    警告
  char* a = "123";
  char* b = "1234";

  if( strlen(a) >= strlen(b) )
  {
    //......
   }

   if( strlen(a) - strlen(b) >= 0)
  {
    //......
   }
  strlen的返回值是用无符号数定义的,因此相减不可能产生负数,以上的语句不等价

5、用一条语句实现strlen
    size_t strlen(const char* s)
    {
        return ( assert(s), (*s ? (strlen(s+1) + 1) : 0) );
    }

6、注意:
    一般情况下,千万千万不要自行编写C标准库已经提供的函数
    标准库有时会使用汇编语言实现,目的就是为了充分利用机器所提供的特殊指令以追求最大的速度
    复用已经存在的函数库会更高效

          重复发明轮子并不是一件有创造性的工作

7、不受限制的字符串函数
     不受限制的字符串函数是通过寻找字符串的结束符'\0'来判断长度
   字符串复制:
           char* strcpy(char* dst, const char* src);
   字符串连接:
           char* strcat(char* dst, cons char* src);
   字符串比较:
           int strcmp(const char* s1, const char* s2);

8、注意事项
    不受限制的字符串函数都是以'\0'作为结尾标记来进行的,因此输入参数中必须包含'\0'
    strcpy和strcat必须保证目标字符数组的剩余空间足以保存整个源字符串
    strcmp以0值表示两个字符串相等
       ·第一个字符串大于第二个字符串的时候返回值大于0
       ·第一个字符串小于第二个字符串的时候返回值小于0
    strcmp不会修改参数值,但依然以'\0'作为结束符

9、strcpy面试题
char* strcpy(char* dst, const char* src)
{
    char* ret = dst;
    
    assert(dst && src);   //安全检测
    
    while( (*dst++ = *src++) != '\0' );
    
    return ret;
}

10、长度受限的字符串函数
     长度受限的字符串函数接收一个显示的长度参数用于限定操作的字符数
    字符串复制:
        char* strncpy(char* dst, const char* src, size_t len);
    字符串连接:
        char* strncat(char* dst, const char* src, size_t len);
    字符串比较:
        int strncmp(const char* s1, const char* s2, size_t len);

11、注意事项
     strncpy只复制len个字符到目标字符串
       ·当源字符串的长度小于len时,剩余的空间以'\0'填充
       ·当源字符串的长度大于len时,只有len个字符会被复制,且它将不会以'\0'结束
     strncat最多从源字符中复制len个字符到目标串中
       ·strncat总在结果字符串后面添加'\0'
       ·strncat不会用'\0'填充目标中剩余空间
     strncmp只比较len个字符是否相等
0 0