要实现这个目标,非stringstream类莫属。
这个类在头文件中定义,
简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。
示例1示范怎样使用一个stringstream对象进行从 string到int类型的转换 注意,使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。
示例1:
string result="10000";
int n = 0;
stream <
int n = 12345;
stream < result =stream.str();// result等于"12345"
示例2:
for (int i= 1; i <10; ++i)
{
strsql <<"insert into test_tab values(";
strsql <
std::string str = strsql.str();// 得到string
res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);
std::cout < strsql.str(""); }
例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。
to_string()函数将t转换为字符串并写入result中。
使用str()成员函数来获取流内部缓冲的一份拷贝:
示例3:
{ ostringstream oss;//创建一个流 oss { stringstream stream; stream<>result;//向result中写入值 return result; }
结论:在过去留下来的程序代码和纯粹的C程序中,传统的形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于 stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃而使用
当然现在还有一个更好的选择,那就是使用boost库中的lexical_cast,它是类型安全的转换。
如下例:
using namespace std;
using namespace boost;
int main(void)
try
{
//以下是内置类型向string转换的解决方案
//lexical_cast优势明显
int ival;
char cval;
ostringstream out_string;
string str0;
string str1;
ival = 100;
cval = 'w';
out_string < str0 = out_string.str(); str1 = lexical_cast(ival) + lexical_cast(cval); cout < //以下是string向内置类型转换的解决方案 //几乎和stringstrem相比,lexical_cast就是类型安全的, int itmpe; char ctmpe; str0 = "100k"; str1 = "100h"; istringstream in_string( str0 ); in_string >> itmpe >> ctmpe; cout < itmpe = lexical_cast(str1); ctmpe = lexical_cast(str1); system( "PAUSE" ); return 0; } catch(bad_lexical_cast e) { cout <