c++ 中 char 与 string 之间的相互转换问题

2023-05-16

       首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。

注意,与char*不同的是,string不一定以NULL('\0')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。

1、将char *或者char []转换为string

可以直接赋值,转换。

2、将string转换为char *或者char []   

string 是c++标准库里面其中一个,封装了对字符串的操作 
把string转换为char* 有  3种方法: 
(1)  调用  string   的   data   函数 
如: 
string str="abc"; 
char *p=str.data(); 

(2)调用  string   的  c_str   函数 

如:string str="gdfd"; 
    char *p=str.c_str(); 

语法: 
const char *c_str();
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数等来操作方法c_str()返回的指针 
比如:最好不要这样: 
char* c; 
string s="1234"; 
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理
 
应该这样用: 
char c[20]; 
string s="1234"; 
strcpy(c,s.c_str()); 
这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作
 
再举个例子
c_str() 以 char* 形式传回 string 内含字符串
如果一个函数要求char*参数,可以使用c_str()方法: 
string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"

(3)调用  string   的  copy   函数 
比如 
string str="hello"; 
char p[40]; 
str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='/0';     //要手动加上结束符
cout < <p;

注意:data只是返回原始数据序列,没有保证会用traits::eos(),或者说'\0'来作字符串结束.   当然,可能多数实现都这样做了。   
c_str是标准的做法,返回的char*   一定指向一个合法的用'\0'终止的C兼容的字符串。   
所以,如果需要C兼容的字符串,c_str  是标准的做法,data  并不保证所有STL的实现的一致性。你或许会问,c_str()的功能包含data(),那还需要data()函数干什么?看看源码:

const charT* c_str () const
{

   if  (length () == 0)

        return "";

   terminate ();

   return data ();

}


       原来c_str()的流程是:先调用terminate(),然后在返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以\0的方式结束,你最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,你就要使用c_str()函数。
        对于c_str() data()函数,返回的数组都是由string本身拥有,千万不可修改其内容。其原因是许多string实现的时候采用了引用机制,也就是说,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看Effective STL的条款15:小心string实现的多样性。
       另外在你的程序中,只在需要时才使用c_str()或者data()得到字符串,每调用一次,下次再使用就会失效,如:定义一个

string strinfo("this is Winter");


(1)最好的方式是:

foo(strinfo.c_str());


(2)也可以这么用:

const char* pstr=strinfo.c_str();
foo(pstr);

如果出现下面的操作,已经使pstr无效了。

strinfo += " Hello!";
foo(pstr);//错误!

       会遇到什么错误?当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可遇见的错误。总之不会是你预期的那个结果。原因为strinfo的数据增多后,而此时内存不够,strinfo有可能会动态更换新内存地址,pstr所指向的地址还为老地址。

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

c++ 中 char 与 string 之间的相互转换问题 的相关文章

  • 使用 scanf 读入 std::string

    正如标题所说 我很好奇是否有一种方法可以用 scanf 读取 C 字符串 我知道我可以读取每个字符并将其插入到应得的字符串中 但我想要类似的东西 string a scanf SOMETHING a gets 也不起作用 提前致谢 这可以工
  • 为不带引号的函数获取字符串参数

    我有一个函数 用于从 URL 下载文件并将其写入磁盘 并施加特定的文件扩展名 目前 它看起来像这样 import requests import os def getpml url filename psc requests get url
  • Python 3:将元组转换为字符串

    我有以下代码 var one var two var three 1 var one string one var 1 我需要对其执行以下操作 var four string two var one 但是 这会返回以下错误 TypeErro
  • 如何在 Ruby 中转义单引号?

    我通过一个脚本 不是我的 将一些 JSON 传递到服务器 该脚本接受 JSON 作为字符串 JSON 的某些内容包含单引号 因此我想确保在传递给脚本之前对所有单引号进行转义 我已经尝试过以下方法 gt irb gt 1 9 3p194 00
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 只保留 A-Z 0-9 并使用 javascript 从字符串中删除其他字符

    我正在尝试验证字符串以使它们成为有效的网址 我只需要保留 A Z 0 9 并使用以下命令从字符串中删除其他字符javascript or jquery 例如 贝儿餐厅 我需要将其转换为 百丽餐厅 所以字符被删除 只保留 A Z a z 0
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 如何仅在 PHP 中使用 str_replace() 删除文本一定次数?

    我试图从字符串中删除单词 John 一定次数 我在 php 手册上读到 str replace 除了第四个参数 count 所以我想可以用来指定应该删除多少个搜索实例 但事实似乎并非如此 因为以下情况 string Hello John h
  • 如何将列表中的每个项目转换为字符串,以便连接它们? [复制]

    这个问题在这里已经有答案了 我需要加入一个项目列表 列表中的许多项目都是从函数返回的整数值 IE myList append munfunc 我应该如何将返回的结果转换为字符串以便将其加入列表 我是否需要对每个整数值执行以下操作 myLis
  • R strsplit:根据字符分割,除非后面有特定字符

    假设我有一个字符串向量 例如 split these c File Location C Documents File Location Pete s Computer File Location 我想根据 分割该向量中的每个元素 除非后面
  • str_ireplace 与 str_replace 一样工作

    我需要用 url 字符串中的小 ascii 字符替换所有本地字符 包括大写字母 str echo str ireplace array array c c d s z str 结果 c c d s z 我期望 c c d s z c c d
  • 在 Swift 中删除字符串中第一个字符的最简洁方法是什么?

    我想删除字符串中的第一个字符 到目前为止 我想到的最简洁的事情是 display text display text substringFromIndex advance display text startIndex 1 我知道我们不能用
  • 字符串被两个不同的分隔符分割

    我有这样的字符串 some dasd dasd dasdas dasdas dasd das dsad 我需要用两个不同的符号将字符串拆分为数组 and 所以我想得到数组 some dasd dasd dasdas dasdas dasd
  • Java ArrayList 的 (ArrayList).toString 的相反是什么?

    我正在使用toString的方法ArrayList储藏ArrayList数据到字符串中 我的问题是 我该如何走另一条路 是否有现有的方法可以解析中的数据String实例返回到ArrayList 最简洁的答案是不 没有简单的方法可以从字符串中
  • 具有相同引用的字符串连接? [复制]

    这个问题在这里已经有答案了 这是我的代码 我现在对字符串池和 通过此输出进行堆存储 public class String1 public static void main String args TODO Auto generated m
  • C语言中的“宽字符串”是什么?

    我在书中看到这样一句话 wscanf L lf variable 其中第一个参数的类型为wchar t 这不同于scanf lf variable 其中第一个参数的类型为char 那么比起来有什么区别呢 我以前从未听说过 宽字符串 我听说过
  • C++/STL 字符串:如何使用通配符模仿正则表达式之类的函数?

    我想使用通配符比较 4 个字符串 例如 std string wildcards H RH H 0 5 in the last one I need to check if string is H0 and H5 只用STL能实现吗 谢谢
  • C# 从带引号的字符串中删除分隔符

    我正在编写一个程序 必须从文本文件中带引号的字符串中删除分隔符 例如 Hello my name is world 必须 Hello my name is world 起初这听起来很简单 我认为是这样 但是您需要检测引号何时开始 何时结束
  • Knuth-Morris-Pratt 算法

    解决方案是Knuth Morris Pratt 算法 https en wikipedia org wiki Knuth E2 80 93Morris E2 80 93Pratt algorithm 干草堆 AAAAAAAAA 针 AAA
  • R:变换不规则时间字符串

    我有两个不同的时间序列 来自不同的数据帧 具有不同的不规则格式 但问题是相同的 我只想提取小时 分钟 秒和毫秒 时代系列看起来像这样 ts1 08 27 23 445 08 27 24 280 08 27 25 115 I tried st

随机推荐

  • PX4开发基础

    文章目录 一 与无人机的缘分二 开发前三 背景知识硬件PIXHAWKpixhawkV1 xff1a pixhawkV2 xff1a pixhawkV3x xff1a PX4 xff08 推荐 xff09 地面站 xff08 GCS xff0
  • 利用蜂鸣器播放音乐

    我们知道 xff0c 蜂鸣器可分为有源蜂鸣器和无源蜂鸣器 xff0c 有源蜂鸣器内置了频率发生电路 xff0c 因此其通电就能够发出声音 xff0c 但是其频率是固定的 xff0c 而无源蜂鸣器内部没有频率发生电路 xff0c 需要外界给予
  • 51单片机之智能小车(避障、跟随、循迹)

    目录 基本概述 硬件组成 功能 关键字 模块介绍 电机模块L9110S 循迹模块 xff08 TCRT5000传感器 xff09 红外避障模块 测速模块 小车 移动小车 xff08 控制电机转动 xff0c 使小车前进 后退 左转 右转 x
  • PX4开发环境搭建(Ubuntu1804+QGC+Qt Creator )

    文章目录 前言一 安装环境二 PX4环境搭建1 在虚拟机中安装Ubuntu2 安装PX4环境 1 下载PX4源码 xff1a 2 安装工具链 3 jMAVSim仿真 4 编译验证 三 安装QGC四 安装Qt Creator五 镜像分享 前言
  • ESP8266————AT指令+网络透传

    一 AT指令 ESP8266可以通过串口的AT指令和其他设备进行通讯或控制 刚开始我以为AT指令是ESP8266本就封装好的 xff0c 直接就可以用 xff0c 结果不是 xff0c 需要自己安装AT固件 xff0c 安装好固件之后直接用
  • 修改pip安装路径的方法

    当我们需要安装python的第三方库时 xff0c 通常都是打开cmd输入pip install xxx去安装 但是默认安装路径在C盘 xff0c 极大占用空间 xff0c 看看我的C盘空间 xff0c 已经不足了 xff01 xff01
  • 详细介绍如何在华为云调用SDK的Python代码(以文字识别OCR技术实现身份证识别为例)

    文章目录 1 保存信息2 安装SDK3 生成代码 1 保存信息 首先我们在首页的产品一栏输入OCR xff0c 找到文字识别OCR 然后找到证件类 xff0c 并点击 xff0c 然后点击立即使用 进入到文字识别 控制台 xff0c 找到身
  • 还是搞不懂Anaconda是什么?读这一篇文章就够了

    文章目录 1 Anaconda介绍2 conda介绍3 安装Anaconda4 Anaconda的使用配置Anaconda源 5 创建虚拟环境并使用5 1 创建虚拟环境5 2 查看所有环境5 3 激活环境5 4 安装包5 4 1 conda
  • 安装tensorflow的GPU版本(详细图文教程)--CUDA11.6的安装

    文章目录 TensorFlow简介TensorFlow是什么tensorflow版本变迁tensorflow 2 0 架构 安装过程常用IDE安装python3 9的安装Anaconda的安装 CUDA安装cuda软件安装cuDNN神经网络
  • 解决visual studio C++ build tools时安装包缺失或损坏的问题(亲测绝对有用!!!)

    安装visual studio C 43 43 build tools时遇到安装包缺失或损坏的问题 这个问题真的困扰我好久 xff0c 尝试过很多种办法都失败了 xff0c 我真的很无语 我尝试过卸载掉visual studio重新下载 用
  • ROS1学习笔记:tf坐标系广播与监听的编程实现(ubuntu20.04)

    参考B站古月居ROS入门21讲 xff1a tf坐标系广播与监听的编程实现 基于VMware Ubuntu 20 04 Noetic版本的环境 文章目录 一 创建功能包二 创建代码2 1 以C 43 43 为例2 1 1 配置代码编译规则2
  • Ubuntu上使用Qt Creator编译、下载PX4代码

    文章目录 一 创建工程文件二 Qt 加载工程文件三 工程的配置四 编译工程五 下载程序六 连接QGC验证 一 创建工程文件 在命令行执行以下几条命令 xff1a span class token function cd span src F
  • ROS1学习笔记:launch启动文件的使用方法

    参考B站古月居ROS入门21讲 xff1a launch启动文件的使用方法 基于VMware Ubuntu 20 04 Noetic版本的环境 文章目录 一 launch的文件结构二 launch的文件语法2 1 根元素2 2 参数设置2
  • ROS1学习笔记:常用可视化工具的使用(ubuntu20.04)

    参考B站古月居ROS入门21讲 xff1a 常用可视化工具的实现 基于VMware Ubuntu 20 04 Noetic版本的环境 文章目录 一 日志输出工具 xff1a rqt console二 绘制数据曲线 xff1a rqt plo
  • 笔记(STM32篇)day1——工程创建、操作寄存器点灯

    目录 一 STM32F103VET6 二 创建工程 1 主要文件 2 生成文件 三 操作寄存器点灯 前言 这一年 xff0c 从调剂到各种找工作面试 去实习 xff0c 感受总结下来就是 出走半生 xff0c 归来仍是萌新 xff0c 作为
  • 手把手教CMake编译Qt5工程

    一 新建CMakeLists txt 可以在工程目录下新建一个名为CMakeLists txt文件 xff0c 亦或是 xff0c 在Qtcreator中 xff0c 右键项目 xff0c 添加新文件 xff0c 选择General中的Em
  • Arduino学习篇 FreeRtos的使用

    ESP32 Arduino中的FreeRTOS使用 在platformio中不需要引入FreeRTOS的头文件 xff0c 直接可用 FreeRTOS使用第一步 xff1a 任务的创建与删除 下面的代码启用了两个任务 xff0c 并且在执行
  • 创建Ubuntu18.04的工作空间、环境变量与增强功能

    一 编译环境变量 在主目录旁显示隐藏文件 xff0c 找到 bashc文件打开来 在最后面加上以下几句代码 source opt ros melodic setup bash source catkin ws devel setup bas
  • Linux内核下gitee的使用

    一 什么是git git是一个开源的分布式版本控制系统 xff0c 用于敏捷高效地处理任何或小或大的项目 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件 Git 与常用的版本控
  • c++ 中 char 与 string 之间的相互转换问题

    首先必须了解 xff0c string可以被看成是以字符为元素的一种容器 字符构成序列 xff08 字符串 xff09 有时候在字符序列中进行遍历 xff0c 标准的string类提供了STL容器接口 具有一些成员函数比如begin end