【C++】经典问题解析之关于面试中c字符串转换C++字符串经常出错的问题
来源
https://blog.****.net/qq_37375427/article/details/79130182
错误转换
#include <iostream>
#include <string>
using namespace std;
int main()
{
const char* p = "12345";
string s = "";
s.reserve(10); //分配内存大小为10
// 不要使用 C 语言中的方式操作 C++ 中的字符串
for(int i=0; i<5; i++)
{
s[i] = p[i];
}
cout << s << endl;
return 0;
}
这个程序运行结果为:空!!!
为什么呢?难道对S的赋值没有成功么?我们给出分析,用C语言描述C++中的字符串,会出现一些异常,看图:
这里可以看出,m_cstr是指向字符串的内容,m_length是string类的成员变量,它指向字符串的长度,经过for循环后,我们操作的不是对象的整体,m_cstr所指向的字符串确实有了,但是m_length却依然为0,所以最后打印出来的是空,
我们应该直接操作这个对象,才能让m_length随着赋值而改变。
正解
我们把程序改成这样:
#include <iostream>
#include <string>
using namespace std;
int main()
{
const char* p = "12345";
string s = "";
s.reserve(10);
s = p; //直接操作对象,不要像C语言那样进行for循环赋值。
// 不要使用 C 语言中的方式操作 C++ 中的字符串
/*
for(int i=0; i<5; i++)
{
s[i] = p[i];
}
*/
cout << s << endl;
return 0;
}
总结
- string类通过一个数据空间保存字符串数据
- string类通过一个成员变量保存当前字符串的长度
- C++开发时,尽量避免C语言的一些惯用的编程思想