您的位置:首页 > 其它

用printf输出 STL string数据类型

2013-02-20 16:47 267 查看
用printf输出 STL string类型数据总结

一.例子

#include <stdio.h>

#include <string.h>

using namespace std;

int main()

{

   string a;

   a[0]='a';

   a[1]='\0';

   printf("%s\n",a);

   system("pause");

}

出错: [Warning] cannot pass objects of non-POD type `struct std::string' through `...'; call will abort at runtime

printf只能输出C语言内置的数据,而string不是内置的,只是一个扩展的类,这样肯定是链接错误的。string不等于char*,&a代表的是这个字符串

的存储地址,并不是指向字符串的首地址,aa 对象中包含一个指向"string"的指针, &aa得到的是这个对象的地址,不是"string"的地址。

printf输出string类型应如此操作!

#include<iostream>

#include<string>

using namespace std;

void main()

{

string aa="qqq";

printf("%s",aa.c_str()); //不推荐

//或者cout<<a;

}

由于string是C的一个 扩展类型,其数据赋值可以用其提供的方法:assign(const char *)或直接用其构造函数       

string str( "Now is the time..." );

2 string 和 C风格字符串

现在看了这么多例子,发现const char* 可以和string 直接转换,例如我们在上面的例子中,使用 string_replace(strinfo, "Winter", "wende");

 

来代用 void string_replace(string & strBig, const string & strsrc, const string &strdst)

 

在C语言中只有char* 和 const char*,为了使用起来方便,string提供了三个函数满足其要求:

1. const charT* c_str()

2. const const charT* data()

3. const size_type copy(charT* buf, size_type n, size_type pos = 0) 

 

其中: 

c_str 直接返回一个以\0结尾的字符串。 

data 直接以数组方式返回string的内容,其大小为size()的返回值,结尾并没有\0字符。 

copy 把string的内容拷贝到buf空间中。 

你或许会问,c_str()的功能包含data(),那还需要data()函数干什么?看看源码:

const charT* c_str () 

const{ 

       if (length () == 0) return "";

       terminate (); 

       return data (); 

     }

 

原来c_str()的流程是:先调用terminate(),然后在返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以\0的方式结束,你最

好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,你就要使用c_str()函数。 

对于c_str()和 data()函数,返回的数组都是由string本身拥有,千万不可修改其内容。其原因是许多string实现的时候采用了引用机制,也就是说

,有可能几个string使用同一个字符存储空间。而且你不能使用sizeof(string)来查看其大小。详细的解释和实现查看Effective STL的条款15:小心

string实现的多样性。

另外在你的程序中,只在需要时才使用c_str()或者data()得到字符串,每调用一次,下次再使用就会失效,如:

string strinfo("this is Winter");...//最好的方式是:foo(strinfo.c_str());//也可以这么用:const char* pstr=strinfo.c_str();foo

(pstr);//不要再使用了pstr了, 下面的操作已经使pstr无效了。strinfo += " Hello!";foo(pstr);//错误!

 

会遇到什么错误?当你幸运的时候pstr可能只是指向"this is Winter Hello!"的字符串,如果不幸运,就会导致程序出现其他问题,总会有一些不可

遇见的错误。总之不会是你预期的那个结果。

4 string 建议

使用string 的方便性就不用再说了,这里要重点强调的是string的安全性。 

string并不是万能的,如果你在一个大工程中需要频繁处理字符串,而且有可能是多线程,那么你一定要慎重(当然,在多线程下你使用任何STL容器

都要慎重)。 

string的实现和效率并不一定是你想象的那样,如果你对大量的字符串操作,而且特别关心其效率,那么你有两个选择,首先,你可以看看你使用的

STL版本中string实现的源码;另一选择是你自己写一个只提供你需要的功能的类。 

string的c_str()函数是用来得到C语言风格的字符串,其返回的指针不能修改其空间。而且在下一次使用时重新调用获得新的指针。 

string的data()函数返回的字符串指针不会以'\0'结束,千万不可忽视。 

尽量去使用操作符,这样可以让程序更加易懂(特别是那些脚本程序员也可以看懂)

 

*************************

为了使用高精度算法,需要从标准输入读取string类型,然后每四位转换为int型输入到数组,但是string类型MS没有直接转换为int的函数,使用

c_str()得到的是一个const的char*类型指针,于是总是错误…………现在需要的是从string转换到int的方案,或者是能截取C风格字符串并转换成

int的办法……

除此之外,如果可以直接给出C++的高精度算法(每四位一个int数组元素)更好(给出可行高精度算法加分)

#include <iostream>

#include <sstream>

using namespace std;

string str = "3";

istringstream is(str.c_str());

int i = 0;

is >> i;

cout << i << endl;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: