`
gstarwd
  • 浏览: 1536654 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用标准C++进行string与各种内置类型数据之间的转换

阅读更多

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

string到int类型的转换

注意,<sstream>使用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<class T>

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

{

 ostringstream oss;//创建一个流

oss<<t;//把值传递如流中

result=oss.str();//获取转换后的字符转并将其写入result
}

这样,你就和衣轻松地将多种数值转换成字符串了:

to_string(s1,10.5);//double到string

to_string(s2,123);//int到string

to_string(s3,true);//bool到string

可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型:

template<class out_type,class in_value>

out_type convert(const in_value & t)

{

stringstream stream;

stream<<t;//向流中传值

out_type result;//这里存储转换结果

stream>>result;//向result中写入值

return result;

}

这样使用convert():

double d;

string salary;

string s=”12.56”;

d=convert<double>(s);//d等于12.56

salary=convert<string>(9000.0);//salary等于”9000”

结论

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

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

 #include <iostream>


#include <sstream>

#include <string>

#include <cstdlib>

#include <boost/lexical_cast.hpp>

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<string>(ival)

                    + lexical_cast<string>(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<int>(str1);

      ctmpe = lexical_cast<char>(str1);

       system( "PAUSE" );

       return 0;

}

catch(bad_lexical_cast e)

{

    cout << e.what() << endl;

    cin.get();

}       

发表于 @ 2006年03月26日 23:04:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:开源软件的许可证 | 新一篇:Access数据库的存储上限
相关文章 roger007 发表于2006年10月19日 22:06:00  IP:举报删除
使用STL实现C++所有数据类型转换为字符串型的to_string函数
及string 到其它数据类型的转换函数

1.数据类型转换为字符串型的to_string函数
template< class T>
inline std::string to_string( const T & Value)
{
std::stringstream streamOut;
streamOut << Value;
return streamOut.str( );
}

// 对原数据类型为string类型的特殊处理
template< >
inline std::string to_string( const std::string & Value)
{
return Value;
}

该函数对所有C++内有数据类型均适用。对支持“<<”运算符的类同样适用。

当然,实现与to_string功能相反的函数也是容易的。

2.string 到其它数据类型的转换函数
template< class T>
inline T from_string( const std::string & ToConvert)
{
std::stringstream streamIn( ToConvert);
T ReturnValue = T( );
streamIn >> ReturnValue;
return ReturnValue;
}

from_string函数将字符串转化为某一类型。例如,它可以将字符串转化为数据。如果输入有效,本函数将转换并返回它。另外,该函数返回指定的类型的默认值,T()为默认的构造函数。还有,它适用与任何C++内有的数据类型,对任何默认构造函数实现了“>>”操作符的类也同样适用。

注意from_string函数假定你转换的字符串中仅有一个值,任何多余的值都将被忽略。如果字符串有多值并且都是你需要的,请勿使用form_string函数,你可以从流中(直接)读取它们。

3.使用这两个转换函数:
下面的例子说明了如何使用上述的两个函数:

int n = 4;
std::string str = to_string( n); // "4"
long l = 534587;
str = to_string( l); // "534587"
n = from_string< int>( "a"); // 0
int nTest = from_string< int>( "5744"); // 5744
int nTest2 = from_string< int>( "57y4"); // 57
int nTest3 = from_string< int>( "5743 65"); // 5743; 65 igno

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/roger_77/archive/2006/03/26/639410.aspx

分享到:
评论

相关推荐

    《C++String深入详解2.0版》PDF

    `std::string` 和 `std::wstring` 之间可以相互转换,以适应不同场景的需求。 **1.7 `std::string` 与 C++ 流** `std::string` 可以通过 C++ 的流机制进行输入和输出。 **1.7.1 C++ 流简介** C++ 流是一系列标准...

    C# 与C++ 数据类型对照

    总的来说,理解 C# 和 C++ 之间的数据类型对照关系对于进行跨语言编程至关重要,这有助于确保数据在不同语言间正确传递和转换,从而避免潜在的类型错误和内存问题。在实际开发中,应根据具体需求选择合适的数据类型...

    C++中的string类

    3. **C风格字符串与`string`之间的转换**: - 使用`c_str()`获取字符串的C风格表示形式。 - 使用`data()`获取指向字符串内容的指针。 ```cpp string str = "Hello"; const char* c_str = str.c_str(); char* ...

    json字符串转换c++类对象

    在C++编程中,将JSON字符串转换为C++类对象是一项常见的任务,特别是在处理网络通信、数据存储或配置文件时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析...

    C++ string深入详解(最新版)

    与 C 语言中的字符数组不同,`string` 类提供了一系列内置的操作,使得字符串处理更加便捷和安全。 **特点:** - **安全性:** `string` 类内部自动管理内存,避免了传统 C 字符串可能引发的内存泄漏或溢出等问题。...

    c++string类函数原型参考.pdf

    在C++中,`std::string`类是用于处理字符串的高效且方便的工具,它提供了许多内置功能,如插入、删除、查找、比较等。然而,在某些情况下,程序员可能需要自定义一个类来实现类似的功能,就像示例中所示的`String`类...

    C++封装的String类,用于Cocos2d-x开发等

    在C++编程中,`String`类通常是一个自定义的字符串类,因为它在标准库中并未像Java那样提供内置的类似`String`的对象。在给定的标题和描述中,我们看到一个专为Cocos2d-x游戏引擎开发的封装`String`类,它提供了类似...

    解码程序参考资料(各种数据 类型转换)

    在处理各种数据类型时,还需要注意内存管理。C++的动态内存分配(如`new`和`delete`)和智能指针(如`std::unique_ptr`和`std::shared_ptr`)可以帮助避免内存泄漏。同时,理解数据类型的大小和对齐规则也是防止意外...

    C++实现http的post发送接收数据以及xml解析

    为了解析XML,C++中没有内置的库,但可以使用第三方库如TinyXML或pugixml。这些库提供API来解析XML文档,提取其中的元素和属性。 例如,使用TinyXML库,你可以先加载XML字符串到`TiXmlDocument`对象,然后遍历`...

    utf-8.rar_c++ string utf-8_string to utf-8_utf_utf 8_utf-8

    首先,C++标准库并没有直接支持UTF-8编码的内置类型,但是我们可以通过`std::string`类来间接地操作UTF-8字符串。`std::string`通常用来存储和处理以字节序列形式表示的文本,而UTF-8恰好就是这样一种以字节为基础的...

    Cstring与其他类型的转换

    在编程中,特别是在使用Visual C++(VC)进行开发时,理解和掌握各种数据类型之间的转换是非常重要的。本篇将深入讲解"Cstring"与其他类型转换的相关知识点,包括VC常用的内置数据类型以及字符串类型如CString、...

    变量、数据类型转换

    这个教程可能通过`vs200507.swf`到`vs200509.swf`这些文件,采用互动的教学方式,逐步引导你理解变量的声明、赋值和使用,以及各种数据类型之间的转换方法。例如,`vs200505.swf`可能讲解基本的数据类型,`vs200506....

    C++随手代码收藏 自定义实现 String 类.docx

    `operator char*()`是一个类型转换函数,将`String`对象转换为`char *`,这样就可以直接使用C风格的字符串函数,如`strlen()`, `strcpy()`, `strcmp()`等。 7. **其他成员函数**: - `strcat(String&, char*)`...

    第2章 C++程序设计基础

    C++还支持自定义的类型,例如字符串型(String),但一般使用标准库中的std::string。 不同的数据类型占用的内存大小是不同的,这直接影响到它们所能表示的数据范围。例如,short int是一种短整型数据类型,而long是...

    C++ Convert 多种字符转换函数

    总结,C++中字符和字符串的转换涉及多种方法和函数,包括使用`std::string`,处理宽字符,以及转换不同的编码格式。了解和熟练掌握这些转换技巧对于编写跨平台的、处理各种字符集的C++程序至关重要。实践中的应用...

    c++ 标准程序库 源代码

    7. **类型转换和数值处理**:包括std::swap、std::abs等,以及类型安全的转换函数如std::stoi、std::to_string等。 8. **字符串和字符处理**:如std::string类和相关操作,以及std::wstring和std::u16string等宽...

    C++_string详解

    相比于传统的C风格字符串(即`char *`),`string` 类提供了更多的内置方法来简化字符串操作,并自动管理内存,从而避免了许多与内存相关的错误。 #### 包含头文件 要在C++程序中使用`string`类,首先需要包含`...

    C++任意进制转换

    对于更复杂的进制转换,如十六进制与二进制之间的转换,可以利用C++标准库提供的`std::hex`和`std::oct`格式操纵符: ```cpp #include #include int main() { int decimalNumber = 255; std::cout ; // 十进制...

    C++11新标准中文版

    C++11对POD类型的定义进行了调整,使得更多类型可以被视为POD。 #### 三、构建期表现的加强 ##### 3.1 外部模板 C++11允许在头文件中声明模板函数或类,并在其他位置定义它们,这样可以避免模板实例化带来的编译...

    C/C++结构体序列化配置模板化

    这通常涉及遍历结构体的所有字段,并根据其类型进行相应的转换。模板可以在这里派上用场,因为它允许我们为不同的数据类型编写一个通用的序列化函数。 以下是一个基本的模板序列化函数的例子: ```cpp template ...

Global site tag (gtag.js) - Google Analytics