【C++】经典问题解析之关于面试中c字符串转换C++字符串经常出错的问题

来源

https://blog.csdn.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语言的一些惯用的编程思想

猜你喜欢

转载自blog.csdn.net/vict_wang/article/details/88781504
今日推荐