c++之解决char转string时出现的乱码问题

 更新时间:2023年08月01日 10:26:44   作者:u010905359  
这篇文章主要介绍了c++之解决char转string时出现的乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

c++ char转string时出现的乱码问题

刷题遇到的问题。大致是这样,需要将一个字符串提取中间一部分,然后转为整形,通过整形转化为字符型,最后返回一个字符串。

若是用

char c ;
string s = &c;

则会出现乱码,内容为字符串s加上乱码。

最后发现原因是:char没有’\0’作为字符串的边界,当输出string时,string可以看成是数组,因为string接受一个地址,那必然是首地址,但string长度并非是1,所以后面的空间并未初始化,则会出现乱码。

string本身就是一个数据结构。

可以通过at来获取内容,即s.at[0].

告知:

当我们用

char c ;
string s = &c;
cout<<s.length();`

结果是16

char c ;
string s;
s = &c;
cout<<s.length();

结果会是12

可以思考下原因。

另一种做法是尝试用char*或char[]来保存变量,此时用string接收不会出现乱码。

另补充冷知识:sizeof(string) = 28;

c++ string 转 char * 出现乱码 内存共用问题

系统:unbuntu16.04 IDE:vscode

出现乱码

std::string str = "Hello Word";
char* p1 = str.c_str();  //出现乱码
char* p2 = str.data();  //出现乱码

出现内存共用

后面的字符串会覆盖之前的:

char * s1 =  (char *)data.getWorkNum().c_str();  //string是 s1:1
std::cout<<s1<<std::endl;
char * s2 =  (char *)data.getName().c_str();   //string是 s2:11
std::cout<<s2<<std::endl;
char * s3 = (char *)data.getDepartment().c_str();  //string是 s3:111
std::cout<<s3<<std::endl;
char * s4 = (char *)data.getRoom().c_str();       //string是 s4:1111
std::cout<<s4<<std::endl;
std::cout<<s1<<std::endl;
std::cout<<s2<<std::endl;
std::cout<<s3<<std::endl;
std::cout<<s4<<std::endl;

打印:

s1:1
s2:11
s3:111
s4:1111
s4:1111   //出现后者覆盖前面所有
s4:1111   //出现后者覆盖前面所有
s4:1111   //出现后者覆盖前面所有
s4:1111   //出现后者覆盖前面所有

解决方法

(1):

char * strc = new char[strlen(str.c_str())+1];
strcpy(strc, str.c_str());

(2):

    char c_workNum[data.getWorkNum().length()];  //其中data.getWorkNum()为字符串
    strcpy(c_workNum,data.getWorkNum().c_str()); 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言实现贪吃蛇游戏代码

    C语言实现贪吃蛇游戏代码

    大家好,本篇文章主要讲的是C语言实现贪吃蛇游戏代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言数据存储归类介绍

    C语言数据存储归类介绍

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-08-08
  • C语言实现职工工资管理系统

    C语言实现职工工资管理系统

    这篇文章主要介绍了C语言实现职工工资管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C语言代码实现简易三子棋游戏

    C语言代码实现简易三子棋游戏

    这篇文章主要为大家详细介绍了C语言代码实现简易三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言数据结构时间复杂度及空间复杂度简要分析

    C语言数据结构时间复杂度及空间复杂度简要分析

    我们在进行编程时,往往会开发诸多的算法,那么我们怎么在那么多算法中找到最好的那个呢?本文主要介绍时间和空间复杂度概念及时间复杂度的求解,预祝读者学习愉快
    2021-10-10
  • Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 解决方案

    Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 解决方

    这篇文章主要介绍了Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 解决方案,需要的朋友可以参考下
    2014-10-10
  • Windows上使用vs编译fdk-aac的教程详解

    Windows上使用vs编译fdk-aac的教程详解

    有时需要在Windows上用到fdk-aac,fdk-aac是源码是cmake的,可以直接转成vs项目,下面就跟随小编一起学习一下如何在Windows上使用vs编译fdk-aac吧
    2023-11-11
  • c++中new一个结构体初始化过程

    c++中new一个结构体初始化过程

    这篇文章主要介绍了c++中new一个结构体初始化过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • C语言单向链表的表示与实现实例详解

    C语言单向链表的表示与实现实例详解

    这篇文章主要介绍了C语言单向链表的表示与实现,需要的朋友可以参考下
    2014-07-07
  • OpenCV中findContours函数参数详解

    OpenCV中findContours函数参数详解

    Opencv中通过使用findContours函数,简单几个的步骤就可以检测出物体的轮廓,很方便。本文将和大家一起探讨一下findContours方法中各参数的含义及用法,感兴趣的可以了解一下
    2022-08-08

最新评论