zoukankan      html  css  js  c++  java
  • [C++再学习系列] stl::string与二进制数据

    C99 有很多和 string 相关的函数,如 strcatstrchrstrcmpstrcpystrlenstrncatstrncmpstrncpy 等。然而使用 C++ 编程时,所有和 string 相关的操作均可以使用 string 类的相关接口完成, string 提供和原来 C 接口类似的功能和性能,同时提供更高的安全性。

    String 类有一个特性: a string of length n must manage a block of memory whose size is at least n + 1 。即长度为 n string 对象,其内存空间至少为 n+1 个字符,且最后一个字符为 ’\0’

    不过在进行 string 操作时,有一点必须牢记: C/C++ 语言的 string 是以 ’\0’ 结尾的,对不以 ’\0’ 结尾的 string 进行操作容易引发错误,甚至导致内存溢出等 crash

    C++string 类,除了用于处理常规 string 操作 外,其本身也可用于存储各种数据 ,如文件数据。使用者采用 string( const char* str, size_type length ); 来封装特定长度的 char* 数据块。 String 类的各种运算符将保证数据传递的完整性,即 string 对象。

    示例:

    #include <iostream>
    using namespace std;
    
    int main() {
            std::string str("test string");
            cout<<str<<"  "<<str.c_str()<<endl;
            cout<<str.size()<<endl;
    
            char* buf = new char[str.size()+1];
            memset(buf, 0, sizeof(buf));
    
            string test(buf, str.size());   // 封装非字符数据
            cout<<test<<"  "<<test.c_str()<<endl;
            cout<<test.size()<<endl;
    
            memcpy(buf, str.c_str(), str.size());
    
            test = string(buf, str.size());   // 封装字符数据,并自动加上 ’\0’ 结束符
            cout<<test<<"  "<<test.c_str()<<endl;
            cout<<test.size()<<endl;
    
            return 0;
    } 
    

    其输出:

    test string  test string

    11

     

    11

    test string  test string

    11

    说明:这个例子说明:当使用 string( const char* str, size_type length ); 来构造string对象时,string对象的长度由外部指定,数据则来自 str ,如果 length 大于 str 地址范围,可能引发 crash!

    这个例子也说明了 string 可用于封装数据,即使是 ’\0’ 的数据。因此,string类可以用于存储各种数据,字符串、非字符串 (图片,视频)等数据。

    注意:将数据拷贝到内存时,不要使用strcpy, 应该使用memcpy,因为strcpystrncpy碰到 ’\0’ 将认为拷贝结束。 总之,不要使用和str*** 相关的函数去操作内存数据,除非数据只能是string(memcpy完全可拷贝任何数据)

    ---------------------------------------------------

    兄弟的公司:立即购--手机购物,诚信网购

    兄弟的公司:立即团

    欢迎转载,请注明作者和出处

  • 相关阅读:
    SQL优化——union与union all 、left join 和 inner join 及 内连接
    用jdk自带工具jvisualvm查看系统内存使用情况
    不重启也能清理catalina.out日志的方法
    自己用crontab弄个定时任务备份日志重启项目
    三层架构的一点理解以及Dapper一对多查询
    Nuget包添加文件
    WPF启动流程-自己手写Main函数
    WPF实现手势解锁
    VS提交码云权限问题
    Json转Dictionary
  • 原文地址:https://www.cnblogs.com/zhenjing/p/string_binary_data.html
Copyright © 2011-2022 走看看