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

要实现这个目标,非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(); }

(0)

相关推荐

  • c++中的string常用函数用法总结

    标准c++中string类函数介绍 注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要.我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?).我们尽可以把它看成是C++的基本数据类型. 好了,进入正题---首先,为了在我们的程序中使用string类型,我们必须包含头文件 <string>

  • 自己模拟写C++中的String类型实例讲解

    下面是模拟实现字符串的相关功能,它包括一下功能: String(const char * s);//利用字符串来初始化对象 String(); //默认构造函数 String(const String & s);//复制构造函数,利用String类型来初始化对象 ~String(); //析构函数 int length(); //返回String类型中字符串的长度 String & operator=(const String & s);//重载=运算符. String &

  • C字符串与C++中string的区别详解

    在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:  C字符串 string对象(C++) 所需的头文件名称  <string>或<string.h> <string>或<string.h> 需要头文件 原因 为了使用字符串函数 为了使用string类 声明 方式 char name[20]; string name; 初始化方式 char name[20]="

  • C++中string的模拟实现

    c++中的string类可以实现字符串对象的一系列操作,如下图就是从cplusplus上截取的string的一部分功能: 接下来我就简单模拟几个函数实现 首先,我们要给出完整的string类,包括构造函数,析构函数,私有成员char* str 并且在类内声明要实现的函数(本文我只实现了operator=,operator[ ],pushback(),以及三个operator+=,五个insert等) #include<iostream> #include<cstring> usin

  • C++中的string类的用法小结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的.也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法.其实,可能很多人很可能会忽略掉标准C++中string类的使用.标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用.现将具体用法的一部分罗列如下,只起一个

  • C++实现String类实例代码

    C++实现String类实例代码 这是一道十分经典的面试题,可以短时间内考查学生对C++的掌握是否全面,答案要包括C++类的多数知识,保证编写的String类可以完成赋值.拷贝.定义变量等功能. #include<iostream> using namespace std; class String { public: String(const char *str=NULL); String(const String &other); ~String(void); String &am

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

    要实现这个目标,非stringstream类莫属. 这个类在头文件中定义, < sstream>库定义了三种类:istringstream.ostringstream和stringstream,分别用来进行流的输入.输出和输入输出操作.另外,每个类都有一个对应的宽字符集版本. 简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作. 示例1示范怎样使用一个stringstream对象进行从 string到int类型的转换 注意,使用string对象来代替字符数组

  • Golang中的自定义类型之间的转换的实现(type conversion)

    这里不讨论数值与字符串之间.或者整型与浮点型之间的转换.这里要讨论的是自定义类型之间的转换,这个转换与其他语言都不一样,而且在go的源码中也被大量使用. 这里列举两个实用的例子. 转换成实现了某个(些)接口的自定义类型 比如:sort包里面的IntSlice,是一个[]int的自定义类型,并且实现了sort.Interface接口,如下所示: type IntSlice []int // 实现sort.Interface接口的方法 func (p IntSlice) Len() int { re

  • 浅析string 与char* char[]之间的转换

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

  • golang 中string和int类型相互转换

    总结了golang中字符串和各种int类型之间的相互转换方式: string转成int: int, err := strconv.Atoi(string) string转成int64: int64, err := strconv.ParseInt(string, 10, 64) int转成string: string := strconv.Itoa(int) int64转成string: string := strconv.FormatInt(int64,10) 字符串到float32/floa

  • C语言中字符串与各数值类型之间的转换方法

    C语言的算法设计中,经常会需要用到字符串,而由于c语言中字符串并不是一个默认类型,其标准库stdlib设计了很多函数方便我们处理字符串与其他数值类型之间的转换. 首先放上一段展示各函数使用的代码,大家也可以copy到自己的机器上运行观察 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int num=183; char str[3]; //itoa函数将整型转换为字符串数值类型 it

  • java string类型转换boolean类型的方法

    今天偶然想把string 类型转换成 boolean 类型 ,查了下api文档,发现文档似乎有点不太对经... 嗯,就直接发测试代码吧,废话懒得说了... String s1 = "false"; String s2 = "true"; String s3 = "fAlSe"; String s4 = "TrUe"; String s5 = "true_a"; 以上的string 分别用 Boolean.g

  • js中string和number类型互转换技巧(分享)

    1.string-->number string类型   *1  即可变成  number类型 2.number-->string number类型  +''  即可变成  string 类型 <script type="text/javascript"> function screenInfo() { var str = '012.8372'; var s = 0; str = str * 1; alert(typeof (str));//number s +

  • 关于C++ string和c类型字符数组的对比

    在c++中string是很方便操作的字符串,支持多种算数运算和比较运算,操作起来非常灵活.string也具有一些容器的性质,可以通过迭代器对字符元素进行访问 c类型的字符数组有如下三种初始化方式: //前两种的初始化方式是等同的,最后一种没有'\0' char *cp="hello"; char c_arr[]="hello"; char c_arr2[]={'h','e','l','l','o'}; 这三种定义c字符串的方式,其中前两种虽然形式不一样但含义是一摸一

  • C++中string转换为char*类型返回后乱码问题解决

    问题来源: 在写二叉树序列化与反序列化时发现序列化函数为char* Serialize1(TreeNode *root)  其函数返回类型为char*,但是我在实现的过程中为了更方便的操作添加字符串使用的是C++中string类型的变量,这就导致我最后得到的结果res是string类型,若是要返回需要转化为char *类型.而等我将string类型转为char*后返回在主函数中就成了乱码. 先直接说最后的解决办法: 第一种:定义一个char数组,数组长度为stringlength+1,将stri

  • 解决springboot 实体类String转Date类型的坑

    目录 springboot 实体类String转Date类型 Date解析String类型的参数 springboot 实体类String转Date类型 前端传入一个String的时间字符串如:2019-07-18 23:59:59 后端实体类要在头顶加注解: @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 不然会出现报错 Date解析String类型的参数 1.首先建立String to Date 的解析实现 import org.a

随机推荐