用标准c++实现string与各种类型之间的转换_C 语言

要实现这个目标,非stringstream类莫属。

这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。

简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。

示例1示范怎样使用一个stringstream对象进行从 string到int类型的转换 注意,使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。

示例1:

复制代码 代码如下:

std::stringstream stream;

string result="10000";

int n = 0;

stream << result; stream >> n;//n等于10000

int到string类型的转换

复制代码 代码如下:

string result;

int n = 12345;

stream << n;

result =stream.str();// result等于"12345"

重复利用stringstream对象 如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法,在多次转换中重复使用同一个 stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU 时间的。经试验,单单使用clear()并不能清除stringstream对象的内容,仅仅是了该对象的状态,要重复使用同一个 stringstream对象,需要使用str()重新初始化该对象。

示例2:

复制代码 代码如下:

std::stringstream strsql;

for (int i= 1; i < 10; ++i)

{

  strsql << "insert into test_tab values(";

  strsql << i << ","<< (i+10) << ");";

   std::string str = strsql.str();// 得到string

   res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);

  std::cout << strsql.str() << std::endl; strsql.clear();

  strsql.str("");

}

转换中使用模板 也可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。

例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。

to_string()函数将t转换为字符串并写入result中。

使用str()成员函数来获取流内部缓冲的一份拷贝:

示例3:

复制代码 代码如下:

template void to_string(string & result,const T& t)

{ ostringstream oss;//创建一个流 oss< out_type convert(const in_value & t)

{ stringstream stream; stream<>result;//向result中写入值 return result; }

这样使用convert(): double d; string salary; string s=”12.56”; d=convert(s);//d等于12.56 salary=convert(9000.0);//salary等于”9000”

结论:在过去留下来的程序代码和纯粹的C程序中,传统的形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于 stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃而使用< sstream>。

当然现在还有一个更好的选择,那就是使用boost库中的lexical_cast,它是类型安全的转换。

如下例:

复制代码 代码如下:

#include #include #include #include #include

 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 << ival << " " << cval;

str0 = out_string.str();

str1 = lexical_cast(ival) + lexical_cast(cval);

cout << str0 << endl; cout << str1 << endl;

//以下是string向内置类型转换的解决方案

//几乎和stringstrem相比,lexical_cast就是类型安全的,

int itmpe;

char ctmpe;

str0 = "100k";

str1 = "100h";

istringstream in_string( str0 );

in_string >> itmpe >> ctmpe;

cout << itmpe << " " << ctmpe << endl;

itmpe = lexical_cast(str1);

ctmpe = lexical_cast(str1);

system( "PAUSE" );

return 0;

} catch(bad_lexical_cast e)

{ cout << e.what() << endl; cin.get(); }

时间: 2024-09-14 16:14:20

用标准c++实现string与各种类型之间的转换_C 语言的相关文章

浅析string 与char* char[]之间的转换_C 语言

1.首先必须了解,string可以被看成是以字符为元素的一种容器.字符构成序列(字符串).有时候在字符序列中进行遍历,标准的string类提供了STL容器接口.具有一些成员函数比如begin().end(),迭代器可以根据他们进行定位. 注意,与char*不同的是,string不一定以NULL('\0')结束.string长度可以根据length()得到,string可以根据下标访问.所以,不能将string直接赋值给char*. 2.string 转换成 char * 如果要将string直接

【转载】如何:在各种字符串类型之间进行转换

[转载]如何:在各种字符串类型之间进行转换2008-03-19 17:36如何:在各种字符串类型之间进行转换 本主题演示如何将各种 Visual C++ 字符串类型转换为其他字符串.可以转换的字符串类型包括 char *.wchar_t*._bstr_t.CComBSTR.CString.basic_string 和 System.String.在所有情况下,在将字符串转换为新类型时,都会创建字符串的副本.对新字符串进行的任何更改都不会影响原始字符串,反之亦然.从 char * 转换示例 此示例

java中基本类型之间的转换

问题描述 java中基本类型之间的转换,笔试中常见的考题及答案,亲们,有能力的就帮忙解答下呗!(额的基础不好呀!) 解决方案 解决方案二:主要是3种,分别如下: 1.字符串和基础数据类型的互相转换 2.基础数据类型和其相对应的包装类的互相转换 3.字符串和基础数据类型的包装类的互相转换  1. (1)字符串转换成为基础数据类型 String s = "200";  int i = Integer.parseInt("s"); 或者 int si2 = new Int

Swift数字类型之间的转换

Swift数字类型之间的转换Swift是一种安全的语言,对于类型的检查非常严格,不同类型之间不能随便转换.一.整型之间的转换在C和Objective-C等其他语言中,整型之间有两种转换方法:从小范围数到大范围数转换是自动的:从大范围数到小范围数需要强制类型转换,有可能造成数据精度的丢失.而在Swift中这两种方法是行不通的,我们需要通过一些函数进行显式地转换,代码如下: let historyScore:UInt8 = 90 let englishScore:UInt16 = 130 let t

Java核心技术卷I基础知识3.5.2 数值类型之间的转换

3.5.2 数值类型之间的转换 经常需要将一种数值类型转换为另一种数值类型.图3-1给出了数值类型之间的合法转换. 在图3-1中有6个实心箭头,表示无信息丢失的转换:有3个虚箭头,表示可能有精度损失的转换.例如,123 456 789是一个大整数,它所包含 的位数比f?loat类型所能够表达的位数多.当将这个整型数值转换为f?loat类型时,将会得到同样大小的结果,但却失去了一定的精度.   当使用上面两个数值进行二元操作时(例如n + f,n是整数,f是浮点数),先要将两个操作数转换为同一种类

string,CString,char*之间的转化_C 语言

string,CString,char*之间的转化 int 转 CString:CString.Format("%d",int);...............................string 转 CString CString.format("%s", string.c_str()); 用c_str()确实比data()要好. .......................................char* 转 CString CString.

《从零开始学Swift》学习笔记(Day 15)——请注意数字类型之间的转换

 原创文章,欢迎转载.转载请注明:关东升的博客     在C.Objective-C和Java等其他语言中,整型之间有两种转换方法:    从小范围数到大范围数转换是自动的:    从大范围数到小范围数需要强制类型转换,有可能造成数据精度的丢失.    而在Swift中这两种方法是行不通的,需要通过一些函数进行显式地转换,代码如下:    let historyScore:UInt8 = 90    let englishScore:UInt16 = 130    let totalScor

string数组类型转换为int数组(数组类型之间的转换)

string数组类型转换为int数组.方法一:ConvertAll的用法 1 public static int StrToInt(string str)2 {3 return int.Parse(str);4 }5 6 string[] arrs = new string[] { "100", "300", "200" };7 int[] arri = Array.ConvertAll(arrs,

利用C++实现从std::string类型到bool型的转换_C 语言

利用输入字符串流:std::istringstream 复制代码 代码如下: bool b;std::string s = "true";std::istringstream(s) >> std::boolalpha >> b; 但当字符串s为"1"时,上面的代码无法正确转换,此时应该用: 复制代码 代码如下: bool b;std::string s = "1";istringstream(s) >> b;