将std::string转换为char[]时出现乱码问题求助
问题根源:缺少C风格字符串的空终止符
你的代码出现乱码的核心原因是:C风格char数组字符串必须以\0(空终止符)结尾,但你没有添加这个终止符,导致cout、printf这类函数会越界读取内存中的随机数据,直到碰到某个\0为止,那些随机数据就表现为��3V这类乱码。
具体代码问题分析
ip是长度为9的字符串(比如"127.0.0.1"),你创建的char ip_in_char[ip.size()]数组大小刚好是9,只能放下9个字符,没有多余空间存储\0。- 当用
cout或printf输出这个char数组时,它们会从数组起始位置开始读,直到找到\0才停止,中间读到的栈上随机内存数据就变成了乱码。 - 你访问
ip_in_char[10]属于越界操作,数组只有索引0-8的有效元素,读取索引10的内容是随机内存值,所以输出�。
修复方案
方案1:手动添加空终止符
创建数组时多预留一个字节的空间,最后手动写入\0:
cout << "IP" << ip << "||" << ip.size(); char ip_in_char[ip.size() + 1]; // 多+1个位置存终止符 for(int ind = 0; ind < ip.size(); ind++){ ip_in_char[ind] = ip[ind]; } ip_in_char[ip.size()] = '\0'; // 添加空终止符 cout << "IP" << ip_in_char << endl; printf("%s\n", ip_in_char); // 注意:不要访问ip_in_char[10],数组有效索引是0-9 cout << "||" << sizeof(ip_in_char) << endl << ip_in_char << endl;
方案2:直接使用std::string的c_str()方法
std::string内置的c_str()方法会返回一个带\0终止符的const char指针,完全可以替代手动转换:
cout << "IP" << ip << "||" << ip.size(); const char* ip_in_char = ip.c_str(); // 直接获取带终止符的C风格字符串 cout << "IP" << ip_in_char << endl; printf("%s\n", ip_in_char); // 同样不要越界访问指针 cout << "||" << strlen(ip_in_char) << endl << ip_in_char << endl;
内容的提问来源于stack exchange,提问作者IDEA
相关产品推荐
相关产品推荐

