string对象和C风格代码的混用

前面的博客《string 类用法及使用》介绍了很多关于string的知识,这里就讲一下string对象和 C风格代码的混用。

我们都知道可以用已下方式来初始化string对象:

string  s(“hello world!”);

实际上我们也可以通过这样的方式来实现:

char c[] = {‘h’,‘e’,‘l’,‘l’,‘o’,‘  ‘,‘w’,‘o’,‘r’,‘l’,‘d’,‘!’,‘\0’};

string s = c;

但是如果数组c不是以空字符结尾的话,那么上面的赋值就是不正确的。


实际上,任何出现字符串字面值(即上面的“hello world!”这种形式)的地方都可以用以空字符结束的字符数组来替代。注意点如下:

1、可以使用以空字符结尾的字符数组来初始化string对象或者给string对象赋值

2、在string对象的加法运算中,可以使用以空字符结尾的字符数组作为其中一个运算对象,但是不能两个都是。在string的加法运算中,要至少保证有一个为string对象。例如:

    char a[] = {‘a’,’\0’};

    char b[] = {‘b’,’\0’};

    string c = “abdc” ; 

    string d = “abcd” + a; //错误,赋值运算右侧没有string对象

    string e = a+b;      //错误,赋值运算右侧没有string对象 

    string f = c +a;    //正确

 

string对象可以用以空字符结尾的字符数组进行操作,但是反过来却不行。不能用string对象对字符指针进行任何操作。不过为了完成从string对象到字符指针的转变,string专门提供了一个c_str成员函数(顾名思义,就是返回c的字符串指针):

       string a = “hello world!”;

       char *str = s;    //错误

       const char *str = s.c_str();   //正确

但是,这样的写法无法保证c_str函数返回的数组一直有效,因为如果后续操作改变了s的值,那么之前返回的数组可能就变了。 比如:

       string d = "abc";

       const char *c = d.c_str();

       cout << c <<endl;

       d = "efg";

       cout << c<< endl;

则输出的结果为:

abc

efg

可以看出string对象变化了,即使我们没有将变化后的值重新赋值给c,但是其结果仍旧跟着变了。所以如果我们想保存当前的字符串,那么最好将结果重新拷贝一份。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值