双录新规范围再扩大!菊风助力泛金融业务办理高效合规可回溯

极客日报:腾讯宣布捐赠1亿元驰援河南;苹果回应iPhone 安全隐患;贝索斯完成10分钟太空之旅

  返回  

【CC++】字符串

2021/7/21 9:35:12 浏览:

目录

  • 1. C
    • 1.1. 概述
    • 1.2. 函数
    • 1.3. 字符串比较
  • 2. C++
    • 2.1. 常用函数

  • 概述
    • 字符串的生命周期;
    • 拷贝截断;

1. C

1.1. 概述

  1. 注意:
    1. src长度超过 dst时,防止访问越界,仅拷贝dst长度的src;
    2. c_str 是string类的一个函数,可以把string类型变量转换成 char* 变量;

1.2. 函数

  1. char *strncpy(char *dest, const char *src, size_t n)
    1. strncpy() 没有车自动加上终止符;
    2. strncpy() 不会清除
    3. 使用strncpy_s() 不是标准库函数;

1.3. 字符串比较

strcasecmp && strncasecmp

  1. strcasecmp
    strcasecmp
    strcasecmp(忽略大小写比较字符串)
    相关函数 bcmp,memcmp,strcmp,strcoll,strncmp
    表头文件 #include<string.h>
    定义函数 int strcasecmp (const char *s1, const char *s2);
    函数说明 strcasecmp()用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异。
    返回值 若参数s1和s2字符串相同则返回0。s1长度大于s2长度则返回大于0 的值,s1 长度若小于s2 长度则返回小于0的值。
    范例

    #include <string.h>
    main()
    {
    char *a="aBcDeF";
    char *b="AbCdEf";
    if(!strcasecmp(a,b))
    printf("%s=%s/n",a,b);
    }
    执行 aBcDeF=AbCdEf
    注意与strncasecmp()的区别,不要弄混了。
    
  2. strncasecmp
    strncasecmp
    相关函数:bcmp, memcmp, strcmp, strcoll, strncmp
    表头文件:#include <string.h>
    函数定义:int strncasecmp(const char *s1, const char *s2, size_t n)
    函数说明:strncasecmp()用来比较参数s1和s2字符串前n个字符,比较时会自动忽略大小写的差异
    返回值 :若参数s1和s2字符串相同则返回0 s1若大于s2则返回大于0的值 s1若小于s2则返回小于0的值

    #include <string.h>
    main()
    {
    char *a="aBcddfefekr";
    char *b="AbCddfefekr";
    printf("%d/n", strncasecmp(a, b));
    }
    亦可用在指定结束与程序入口
    eg:if(!strncasecmp(buffer,"quit",4))
    break;
    eg:if(!strncasecmp(buffer,"work",4)){
    printf("hello,world!");
    break;
    }
    

2. C++

2.1. 常用函数

  1. substr 子字符串

    basic_string substr( size_type pos = 0,
                        size_type count = npos ) const;
    
  2. stringstream.str() 临时变量的lifecycle

    //存在问题:
    int main ()
    {
        stringstream ss;
        ss << "Hello";
        string s = ss.str();
        const char * p = s.c_str();
        cout << p << endl;
    
        return 0;
    }
    //解决方法
    int main ()
    {
        stringstream ss;
        ss << "Hello";
        const string &s = ss.str();    //避免不必要的copy
        const char * p = s.c_str();
        cout << p << endl;
    
        return 0;
    }
    

ss.str()会生成一个临时string类型变量,第10行结束时,这个临时变量就释放了,但const char *指针p仍然指向那个临时变量的buffer。我们不能假设临时的string类型变量已经被释放(析构)了的情况下,它的buffer内容仍然有效;

  • 解决方法:
    • 使用局部变量来解决;
  1. append() 函数
    1. append(’\0’) 失败原因
      是由于C++重载造成的
      string& append (const string& str);
      string& append (const char* s);
      append('\0')调用的是第二个版本,
      append('\0')是会运行出错的, 用append("\0")才可以.
      
      既然接收的是 char *, 就应该按C风格的字符串来, "\0"就是空串, 当然什么也不append.
      而:
      string tmp;
      tmp.push_back('\0');
      再往你的string里append(tmp) 你就会发现'\0'被append进去了.
      

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号