std::string , Qstring和 const char * 的互相转换_ythunder的博客-程序员秘密

技术标签: c++  c  

原文地址:https://argcv.com/articles/2691.c

好多人都喜欢重新造一个轮子, 所以这个世界上的的轮子千奇百怪. 作为在这些轮子下面苟延残喘的洒家,往往不得不无尽的寻找两个轮子之间转换的方法. STL库, 作为标准库, 在写C++的时候理所当然的, 被各种使用. const char * 数组, 作为和C一起过来的小伙伴, 在很多场合下也会被调用. 如果脑抽居然还打算使用Qt, 那么,Qt自带的QString, 恐怕也很难有人能完全不使用. 于是乎, 类型转换就是个问题了.

const char * 数组和 STL的转换, 这两者的转换最为常见.

const char * => STL 我一般直接使用

const char * s = "hello , world!";
string str(s);

直接赋值完毕了.

如果是作为一个参数,还可以直接用调用string的构造函数.

const char * s = "hello const char";
string s1("hello , string1 ");
string s2 = s1 + string(s);

s2就这样轻松搞定.

需要注意的是, string 的拼接不建议用上述的写法, 若条件允许, 写成这样会更好一些:

const char * s = "hello const char";
string s1("hello , string1 ");
s1 += string(s);

string 到const char *就更加简单了

string str("hello world !");
const char * s = str.c_str();

不过需要注意的是,这个当前stack下只能被调用一次,就会被系统自动释放掉. 当然,你可以作为参数传入某个function,然后被调用很多遍,然后一return这个s就不能再用了. 所以这个 .c_str() 似乎专门就是为了传参时候的类型转换用的.

QString这个第三者的加入 const char * => QString, QString当然不敢不支持. 和STL的string一样,

const char * s = "hello , world !";
QString qs1(s);
QString qs2 = qs1.append(QString(s));

两种方法都是可以的.

如果需要特定编码的话,还可以

QString qs3= QString(QLatin1String(s));
QString qs4 = QString::fromLocal8Bit(s);

而QString=> *有很多方法.最直白的是这样的

QString qs1= "Hello , world !";
QByteArray ba = qs1.toLocal8Bit();
const char *s = ba.data();
const char *s2 = ba.constData();

当然还可以这样:

QString qs1= "Hello , world !";
string str = qs1.toStdString();
const char *s= str.c_str();

其实就是先转为 STL 的 string 再转为 const char *.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ythunder/article/details/53812850

智能推荐

css实例 <转载>_s306587279的博客-程序员秘密

&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;gt;&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; lang=&quot;gb2312&quot;&amp;gt;    &amp;l

简单几步,让Mac外接显示器更好用_2015年imac怎么作为显示屏_茶茶π的博客-程序员秘密

光懂得给MacBook连接外置显示器还不行,了解这几点,才能让Mac外接显示器更好用。可以在两个显示器桌面之间任意拖拽移动软件窗口,这也是双(多)显示器一个高效的地方。将外接显示器设置为最佳分辨率MacBook连接上外接显示器后,打开【系统偏好设置】-【显示器】,会在 MacBook 显示器和外置显示器同时打开显示器设置窗口。外接显示器分辨率应设置为显示器本身最大支持的分辨率。一般会自动选择为【显示器默认】,就是最佳分辨率,就不需要做任何设置。如果默认分辨率不对,手动选择【缩放】,并选

linux上网络带宽监控命令,Linux服务器上监控网络带宽的18个常用命令_壮士请收下我的赞的博客-程序员秘密

本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示。一些命令可以显示单个进程所使用的带宽。这样一来,用户很容易发现过度使用网络带宽的某个进程。这些工具使用不同的机制来制作流量报告。nload等一些工具可以读取"proc/net/dev"文件,以获得流量统计信息;而一些工具使用pcap库来...

尚硅谷MySQL高级学习笔记 -- 2.索引优化分析_exodus3的博客-程序员秘密

1、慢 SQL 性能下降、 SQL 慢、执行时间长、等待时间长的原因分析 查询语句写的烂索引失效: 单值索引:在user表中给name属性建个索引,create index idx_user_name on user(name)复合索引:在user表中给name、email属性建个索引,create index idx_user_nameEmail on user(name,email) 关联查询太多join(设计缺陷或不得已的需求)服务器调优及各个参数设置(缓冲、线程数等) 2、jo

c语言三角波变成正弦,三角波转正弦波实现原理及电路图分享_吟澜的博客-程序员秘密

描述三角波三角波(TriangularWave)也称锯齿波,是指主要用在CRT作显示器件的扫描电路中的波形。如示波器,显像管,显示器等.CRT是由许多点组成的。要形成光栅就要有电子束轰击这些发光点。扫描电路分水平和垂直扫描两种。可以一行或一帧的对CRT进行扫描。电子束从第一行或帧的一端开始扫到另一端,马上返回扫第二行或第二帧。三角波的特点是电压渐渐增大突然降到零。正好适合用于扫描电路中。正弦波正弦...

从微软官网下载win10镜像.iso文件_梦逸清尘的博客-程序员秘密

需求下载win10镜像文件方法下载MediaCreationTool:https://www.microsoft.com/zh-cn/software-download/windows10启动MediaCreationTool选择:选择需要的windows版本选择ISO file点击Next,并选择ISO下载文件的存储位置,即可实现ISO文件的下载。参考[1] http...

随便推点

Valgrind内存泄漏工具的安装与使用 -- Linux_zerokkqq的博客-程序员秘密

Valgrind内存泄漏检测工具是一个十分便捷的工具,可以很快速的检测出所写程序是否存在内存泄漏现象,这对于C/C++程序员显得尤为重要,因为不论你有多牛逼,也难以保证自己不会忘写一个delete或者free。一:安装步骤首先下载一个Valgrind安装包。1.解压安装包 zip格式用 uzip Valgrind.xx.zip,解压完成之后进入该文件夹。2.运行./autogen.sh设置环境在执...

Selenium中的几种等待方式,需特别注意implicitlyWait的用法_breiofsd的博客-程序员秘密

最近在项目过程中使用selenium 判断元素是否存在的时候 遇到一个很坑爹的问题, 用以下方法执行的时候每次都会等待很长一段时间,原因是因为对selenium实现方法了解不足导致一直找不到解决方法。  private boolean isElementPresent(By by) {     try {      driver.findElement(by);      

play框架使用起来(13)_play框架 中db工具类_zyhlal的博客-程序员秘密

高级指南1、文件上传1.1 架构考虑#      应用中通常有两种方式来保存二进制数据:将数据保存到服务器的文件系统中,或者直接保存到数据库中。当然这两种实现各有利弊,使用文件系统非常容易,而使用数据库则具有事务处理支持,但两者都有通病,那就是很难扩展。      这一节需要向读者着重强调的是,Play中提供的play.db.jpa.Blob类型,与

ASP.NET 2.0发送电子邮件全面剖析之二_yhlaser的博客-程序员秘密

  一、简介  在上篇中我们详细分析过,.NET框架2.0版本提供了一个新的命名空间(System.Net.Mail)和一些发送电子邮件的新类(注意:.NET框架1.x版本中提供的命名空间System.Web.Mail及相关的类仍然可以使用,以实现向后兼容性)。而且,我们还详细分析过如何使用System.Net.Mail命名空间中的MailMessage和SmtpClient类来发送简单的普通文本

Vue浏览器微信/支付宝支付_li_zongfei的博客-程序员秘密

Vue浏览器微信/支付宝支付微信支付// 微信支付 wxpay () { let params = { actCode: this.actCode,// 活动编号 channelType: 'WxPay', // 支付方式 clientType: this.clientType, // 渠道(未传,浏览器后端默认设置的web, iOS/ Android/, 详情请查看底部获取渠道代码) mobile: localStor

Hbase原理、基本概念、基本架构_hbasw_行者无疆_super的博客-程序员秘密

概述HBase是一个构建在HDFS上的分布式列存储系统;HBase是基于Google BigTable模型开发的,典型的key/value系统;HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储;从逻辑上讲,HBase将数据按照表、行和列进行存储。与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加计算...