string和char*互转以及c_str()的陷阱

2023-05-16

string类型和char*、char[]的转换

string转const char *:

1. 使用string的成员函数c_str();
2. 使用string的成员函数data();
3. 注意事项:c_str()data()的不同之处在于,data()会返回没有结束符的字符数组指针。并且需要强调一点,调用c_str()data()得到的指针指向的地址和原来的string是一个地址,所以只要string改变了,c_str()data()的返回值也会改变。
测试代码如下:

#include <iostream>
using namespace std;
#include <string>

int main()
{
    string s = "123123";
    const char *p1 = s.c_str();
    cout << "改变string之前的p1的值: ";
    cout << p1 << endl;
    s = "321321";
    cout << "改变string之后的p1的值: ";
    cout << p1 << endl;

    const char *p2 = s.data();
    cout << "改变string之前的p2的值: ";
    cout << p2 << endl;
    s = "123123";
    cout << "改变string之后的p2的值: ";
    cout << p2 << endl;

    return 0;
}

输出结果为:

改变string之前的p1的值: 123123
改变string之后的p1的值: 321321
改变string之前的p2的值: 321321
改变string之后的p2的值: 123123

这点特性很可能造成你的代码产生某些错误。需要警惕。
解决的方法也很简单,就是调用strcpy()函数将c_str()或者data()返回的字符串拷贝给另外一个字符串即可。

string转char *:

1. 使用string的成员函数copy();

char *转string:

1. 直接赋值即可

cha[]转string:

1. 使用string的成员函数copy()
2. 遍历赋值

代码如下:

#include <iostream>
using namespace std;
#include <string>
#include <cstdio>
int main()
{
    /*  string =====> const char*   */

    string s1 = "123123";
    const char *p1 = s1.c_str();
    cout << p1 << endl;

    const char *p2 = s1.data();
    cout << p2 << endl;

    /*  string =====> char *        */
    string s2 = "321321";
    char *p3 = NULL;
    p3 = (char *)malloc(s2.length() * sizeof(char));
    s2.copy(p3, s2.length(), 0);
    cout << p3 << endl;

    /*  char * =====> string        */
    char *p = "12341234";
    string s3 = p;
    cout << s3 << endl;

    /*  string =====> char []       */
    //方法一(使用copy函数:
    string s4 = "44444"
    char p4[6] = {0};
    s4.copy(p4, s4.length(), 0);
    p4[s4.length()] = '\0'; //填充结束符
    cout << p4 <<endl;          

    //方法二(遍历赋值:
    string s5 = "1232";
    char p5[5] = {0};
    int i;
    for(i = 0; i < s5.length(); i++)
    {
        p5[i] = s5[i];
    }
    p5[i] = '\0';
    cout << p5 << endl;
    return 0;

}

这里需要注意几点:

1. c_str()data()成员函数只能用于const char *类型
2. 字符数组需要自己添加结束符’\0’,不然会出现乱码。字符串(char*)则不需要。
3. string转char[]时不能直接赋值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

string和char*互转以及c_str()的陷阱 的相关文章

  • 如何从 C# 中的字符串中删除所有空白字符?

    亲爱的程序员朋友们 我正在 C Visual Studio 2013 中编写一些代码 我刚刚意识到我可能不需要使用Trim 当我做Replace string Empty 示例如下 SanitizedString RawString Rep
  • 如何生成唯一的 6 位数代码

    我想生成 6 位唯一代码 但我希望前 3 个是字母 后 3 个是数字 如下例所示 AAA111 ABD156 DFG589 ERF542 请帮助使用上述组合创建代码 下面是我的代码 public function generateRando
  • 字符类型边界处增量运算符的行为

    我想知道 C 在这种情况下的表现如何 char variable 127 variable 在这种情况下 变量现在等于 128 但是 增量运算符是否将值包装到其下限或是否发生了溢出 发生溢出并导致未定义的行为 第 5 5 节 如果在计算表达
  • 三引号内可以有变量吗?如果是这样,怎么办?

    对于某些人来说 这可能是一个非常简单的问题 但它却难倒了我 你能在Python的三引号内使用变量吗 在下面的例子中 如何在文本中使用变量 wash clothes tuesdays clean dishes never mystring I
  • 读外国文字

    我有一个包含英超足球运动员姓名的数据库 我正在将其读入 R 3 02 但当涉及到姓名中含有外来字符 元音变音 重音符号等 的球员时 我遇到了困难 下面的代码说明了这一点 PlayerData lt read table C Users Do
  • Javascript 中内置函数“str.replace()”的时间复杂度或 Big O 表示法是多少?

    我很困惑如果时间复杂度str replace 函数的复杂度为 O n 或 O 1 例如 var str Hello World str str replace Hello Hi console log str gt str Hi World
  • C# 中的 String 和 string 有什么区别?

    这两者之间有什么区别 我应该使用哪一个 string s Hello world String s Hello world string https learn microsoft com en us dotnet csharp langu
  • PHP 正则表达式 [仅接受选定的字符]

    我想接受用户输入的字符列表并拒绝其余的 我可以接受格式化字 符串或查找是否缺少字符 字符串 但我如何才能只接受一组字符而拒绝所有其他字符 我想使用 preg match 来做到这一点 例如允许的字符有 a z A Z 用户必须能够以任何顺序
  • 如何根据条件分割字符串

    分割字符串时 如何确保如果分隔符位于两个字符之间 则不会被考虑 Input String string a b c d e String split string split Output split 0 a split 1 b split
  • C# - 从另一个字符串中删除第一次出现的子字符串的最简单方法

    我需要从另一个字符串中删除第一个 并且仅第一个 出现的字符串 这是替换字符串的示例 Iteration This ProjectName Iteration Release1 Iteration1 会变成这样 ProjectName Rel
  • 如何在 Ruby 中获取从位置 N 到最后一个字符的子字符串?

    我想从字符串中获取从位置 N 到字符串末尾的子字符串 在 Ruby 中如何做到这一点 只需将字符串切片即可 string N 1
  • Visual Basic 6.0 中的无效限定符错误

    在 Visual Basic 6 0 程序中 我有一个字符串 sTemp 我想确保它不包含引号 我有这行 If sTemp Contains Then 但是当我在 sTemp 之后输入句点时 我没有从智能感知中得到任何信息 并且当我尝试编译
  • 在 C++ 中使用哪些字符串类?

    我们有一个用 C MFC 编写的多线程桌面应用程序 目前开发人员使用 CString 或 std string 可能取决于他们的心情 所以我们想选择一个实现 可能不是这两个 MFC 的 CString 基于写时复制 COW 习惯用法 有些人
  • 触发变量中 python 字符串的 f 字符串解析

    这个问题来自于处理jupyter magics 但可以用更简单的方式表达 给定一个字符串s the key is d key 和一本字典d key val 我们要解析该字符串 旧的方法是 format 这会引发错误 它不处理字典键 the
  • 如何重构“字符串类型”代码?

    我目前正在开发一个代码库 其中有几类变量 例如数据库路径 它们简单地表示为字符串 这些 非 类型的大多数操作都在实用程序类中定义 我创建了一个新类来表示数据库 并将操作定义为实例方法 采用传统的 OOP 风格 然而 浏览大型代码库并重构它以
  • 如何在文本文件中找到最长的 N 行并将其打印到标准输出?

    第一行包含数字 N 的值 后跟多行 我可以按照n 2算法的顺序解决它 有人可以建议一个更好的吗 您可以使用最小堆并在 O n log N 中完成 heap new Min Heap N foreach line in text if len
  • 当字符串太长时截断

    我有两个字符串 short string hello world long string this is a very long long long string suppose more than 10000 chars 我想改变默认行为
  • 在 PHP 中用星号 (*) 提示或部分隐藏电子邮件地址

    我有这个邮件地址 email protected cdn cgi l email protection 如何将其转换为该邮件地址a email protected cdn cgi l email protection 我尝试使用strpos
  • 单词和表情符号计数器

    我有一个包含 clear message 列的数据框 并且创建了一个用于计算每行中所有单词的列 history word count history clear message apply lambda x Counter x split
  • PHP检查字符串是否包含多个单词

    我在互联网上查找了一些可以做到这一点的东西 但它只能用一个词来实现 我正在尝试构建一个脚本来检测我的网站的错误用户名 如果用户名包含数组中的任何单词 则将检测到错误的用户名 这是我编写的代码 但未能运行 bad words array yo

随机推荐

  • arduino/Mixly使用TCS230颜色识别传感器

    一 器材 TCS230 arduino uno 二 接线 TCS230arduino unoGNDGNDVCC5VS0D2S1D3S2D4S3D5OE LEDD6OUTD7 三 程序 mixly程序 arduino程序 define tcs
  • arduino/Mixly心知天气

    一 准备 首先百度一下心知天气 xff0c 获取一下密钥 xff0c 具体的可以看这一篇Blynk中WebHook组件的使用方法 moshanghuaw的博客 CSDN博客 然后再准备一个esp8266或者esp32都可以 二 程序 mix
  • C For Linux之内存访问-内存简介

    1 内存 1 1 计算机为什么需要内存 存储器是计算机系统中非常重要的组成部分 计算机中的存储器分为两类 xff1a 内存储器的外存储器 xff08 也叫辅助存储器 xff09 所谓外存储器在PC机中一般指硬盘 U盘 光盘等 xff0c 而
  • 每天一分钟玩转golang:基础类型之字符串(四)

    大家好 xff0c 我是加摩斯 xff0c 觉得文章有帮助的小伙伴 xff0c 记得一键三连哟 xff5e 申明 xff1a 本系列两天更新一篇 xff0c 纯原创 xff0c 转载前请与我沟通 字符串类型也是一种基本类型 xff0c 底层
  • 项目二:电子骰子

    项目二 xff1a 电子骰子 文章目录 项目二 xff1a 电子骰子一 导入 5分钟 xff09 学习目的 二 新授 65分钟 1 预展示结果 5分钟 2 本节课所用的软硬件 5分钟 3 硬件介绍 1分钟 4 图形化块介绍 1分钟 5 单个
  • 项目三:双人骰子

    项目三 xff1a 双人骰子 文章目录 项目三 xff1a 双人骰子一 导入 5分钟 xff09 学习目的 二 新授 65分钟 1 预展示结果 5分钟 2 本节课所用的软硬件 5分钟 3 硬件介绍 1分钟 4 图形化块介绍 1分钟 5 单个
  • 项目四:无极调光台灯

    项目四 xff1a 无极调光台灯 文章目录 项目四 xff1a 无极调光台灯一 导入 5分钟 xff09 学习目的 二 新授 65分钟 1 预展示结果 5分钟 2 本节课所用的软硬件 5分钟 3 硬件介绍 5分钟 4 图形化块介绍 10分钟
  • Windows10安装anaconda之后pip3不能使用

    1 在命令行中切换到你自己的anaconda环境中 xff0c 2 在命令行中 xff0c 切换到你的anaconda环境中的Scripts目录中像我是在 xff1a D software anaconda3 az envs py3 pyt
  • UE4蓝图通信-蓝图接口

    蓝图接口 除了最常用的cast to蓝图节点可以实现通信以外 xff0c 进阶的通信方式就是蓝图接口 目的 xff1a 与多个对象中的特定几个对象进行通信方式 xff1a 对检测到的对象发送消息消息 xff1a 发出的消息是接口消息 xff
  • UE4蓝图通信-事件分发器(Event Dispatcher)

    事件分发器在蓝图编辑器的我的蓝图选项卡中创建 在我的蓝图 xff08 My Blueprint xff09 面板中的 进行创建输入事件分发器的名称 xff0c 该字段显示在 我的蓝图 xff08 My Blueprint xff09 选项卡
  • UE4项目优化(帧数优化)相关知识

    控制台命令 r screenpercentage 0 100 0是百分之百 如果改了这个 游戏运行超级流畅说明瓶颈在GPU上stat fps 显示帧率 Frame Per Second 或者快捷键Crlt 43 Shift 43 H 显示帧
  • 计算机图形学【GAMES-101】2、光栅化(反走样、傅里叶变换、卷积)

    快速跳转 xff1a 1 矩阵变换原理Transform 旋转 位移 缩放 正交投影 透视投影 2 光栅化 反走样 傅里叶变换 卷积 3 着色计算 深度缓存 着色模型 着色频率 4 纹理映射 重心坐标插值 透视投影矫正 双线性插值MipMa
  • 计算机图形学【GAMES-101】10、材质(BRDF)(折射、菲涅尔项、微表面模型、各向异性材质)

    快速跳转 xff1a 1 矩阵变换原理Transform 旋转 位移 缩放 正交投影 透视投影 2 光栅化 反走样 傅里叶变换 卷积 3 着色计算 深度缓存 着色模型 着色频率 4 纹理映射 重心坐标插值 透视投影矫正 双线性插值MipMa
  • 【重心坐标插值、透视矫正插值】原理以及用法见解(GAMES101深度测试部分讨论)

    文章目录 1 Barycentric Coordinates xff08 重心坐标 xff09 1 1 重心坐标概念1 2 重心坐标计算方式1 3 重心坐标插值 2 重心坐标计算公式推导3 透视投影插值矫正3 1 透视矫正后的 96 深度插
  • gcc之inline函数探究

    1 引子 xff1a 内联函数 xff08 以下称为inline函数 xff09 的行为类似于宏 xff0c 但是会像函数一样进行参数的静态类型检查 因此gcc中很多地方倾向于使用inline函数来替代宏 但是inline函数在gcc中应该
  • Visual Studio中多个源文件、多个main()函数如何分开运行

    对于跟网课的小伙伴 xff0c 有些初学者可能像我以前一样 xff0c 想记录每一课的代码 xff0c 会一节课一个 sln解决方案 xff0c 这样非常不方便 如果一个 cpp放一个main函数 xff0c 再F5运行肯定报错咯 xff0
  • C++中的变参宏 #define MyMacro(...)(__VA_ARGS__)

    span class token macro property span class token directive hash span span class token directive keyword define span span
  • 使用premake帮助生成Visual Studio解决方案

    Premake xff1a https github com premake premake core Premake 是一个基于 Lua 脚本语言的构建系统工具 xff0c 用于生成项目文件和构建脚本 xff0c 能够帮助开发者快速创建和
  • Vulkan中renderpass、subpass、dependency的见解

    在Vulkan中 xff0c 渲染通道 Render Pass 是一个描述渲染过程中使用的附件的对象 xff0c 可以包含多个 subpass 和附件依赖关系 假设我们需要创建一个render pass xff0c 它包含2个附件 1个子通
  • string和char*互转以及c_str()的陷阱

    string类型和char char 的转换 string转const char 1 使用string的成员函数c str 2 使用string的成员函数data 3 注意事项 xff1a c str 和data 的不同之处在于 data