`
waret
  • 浏览: 136745 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

关于C++字符转换的方法 By Hyrish

阅读更多

C里面提供了很多的函数可以方便的进行字符的判断与转换字符串,但如果是在写C++程序时,应该尽量使用标准C++的处理方法,这里将简要介绍几种常用的处理方法。

1.string类的原型
string其实是一个用typedef定义的类型,定义在<string>头文件中,原型为:

std {
    template< class charT, class traits= char_traits<charT>,class Allocator= allocator<charT> >
    class basic_string;
    typedef basic_string<char> string;
    typedef basic_string<wchar_t> wstring
}

    上面string等同于basic_string的char类型,也是一个模板类,只是模板参数固化为char类型了。string用于普通ASCII字符串操作,而wstring是basic_string的wide char类型实作版,用于Unicode字符串操作。

2.将C字符串转换为C++的string类型

    //方法1:初始化类方法
    char *cstr= “hello world”;
    std::string str(cstr);

    //或者:方法2:/赋值方法
    char *cstr= “hello world”;
    std::string str;
    str.assign(cstr);

    //或者:方法3:与assign函数等效
    char *cstr= “hello world”;
    std::string str;
    str=cstr;

     说明:string类的=操作符重载函数,将指针字符串转换为string类,在它的内部实现中其实也是调用assign()函数。

3.将C++的string类型转换为C字符串

    std::string str(“hello world”);
    char* cstr;
    cstr= str.c_str();

    说明:string类的c_str()函数返回C指针样式的字符串,注意返回的字符串会在未尾追加”\0”,与之对应的data()函数也返回C指针的字符串,但不追加”\0”,在使用cstr时应该小心,因为它只是string类中字符串缓冲区的指针,当改变string的值后,该指针将无效。

4.将string类型转换为int,long等数值类型
    string是不能直接转换为数值类型,这里需要一个字符串流来中转,可以用于转换的字符串类有istringstream, ostringstream, stringstream,在<sstream>头文件中声明,关于它们详细的使用方法请参考相关与教程,下面是它们的原型申明:

namespace std{
    template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_istringstream;
    typedef basic_istringstream<char> istringstream;
    typedef basic_istringstream<wchar_t> wistringstream;

    template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_ostringstream;
    typedef basic_ostringstream<char> ostringstream;
    typedef basic_ostringstream<wchar_t> wostringstream;

    template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > class basic_stringstream;
    typedef basic_stringstream<char> stringstream;
    typedef basic_stringstream<wchar_t> wstringstream;
}

    其中istringstream用于字符串缓冲区输入操作,ostringstream用于字符串缓冲区输出操作,stringstream既可用于输入,也可用于输出。

    int i;
    float f;
    std::string stri(“10”);
    std::string strf(“10.3”);
    std::istringstream istri(stri);//使用stri来初始化istringstream
    std::istringstream istrf(strf);//使用strf来初始化istringstream
    istri>>i;
    istrf>>f;

    结果:

    i = 10;
    f = 10.3;


5.将数值类型转换为string 类字符串

    int i=10;
    std::string str;
    std::ostringstream ostr;
    ostr<<i;//将i输出到ostringstream缓冲区中
    str= ostr.str();//取出 ostringstream中的字符串

     其中ostringstream的str()函数返回缓冲区的string字符串,带参数时则重新设置缓冲区的字符串。


6.string的遍历
    这里我们没有必要再用C的方法来对字符串遍历,C++提供了很好用的遍历方法,以下是C样式的遍历:

    C++中很多容器类中提供了iterator嵌套类,用来遍历该容器中的元素,string也不例外,下面是使用string的iterator遍历示例:

    std::string str(“hello world”);
    std::string::iterator pos;
    for( pos=str.begin(); pos!=str.end(); pos++)
    {
        char c=*pos;  // 取其中一个字符
        // todo
    }

 

7.一个综合转换的例子
    它从命令行得到一个十六进制样式的字符串,将它转换为十进制模式的字符串存储到string中,然后遍历string,以十六进制的行式输出到终端。

    //stringtest.cpp
    #include<iostream>
    #include<sstream>
    #include<iomanip>
    int main(int argc, char** argv)
    {
        if( argc<=1)
            return 0;
        std::stringstream buf;
        std::string str;
        for(int i=1; i<argc; i++)
        {
            int num;
            buf.clear();//清除buf的所有错误标志
            buf.str(argv[i]);
            buf>>std::hex>>num;//注意此时buf会置eof标志
            str+= (char)num;
        }
        std::cout<<"str(dec)="<<str<<std::endl;
        std::string::iterator pos;
        std::cout<<"std(hex)=";
        for( pos=str.begin(); pos!=str.end(); pos++)
        {
            //以两个十六进制数行式输出,用空格分隔
            std::cout<<std::setfill('0')<<std::setw(2);
            //注意string保存的是有符号字符串,而真实的值是无符号的,需要转换成
            //正确的值,而std::hex标志只对int等数值起作用,所以还要转换成int
            std::cout<<std::hex<<(int)(unsigned char)*pos<<" ";
        }
        std::cout<<std::endl;
        return 0;
    }

编译此程序:

g++ stringtest.cpp -o stringtest

下面是测试数据:

[root]# ./stringtest 01 02 03 45 a3 e8
str(dec)=###E�
std(hex)=01 02 03 45 a3 e8
[root]# ./stringtest 68 65 6c 6c 6f
str(dec)=hello
std(hex)=68 65 6c 6c 6f


8.小结
    本文简要介绍了string转换的一些方法,string的简单遍历,以及string stream转换的方法,让我们在写程序时把精力放在程序逻辑上,而不用关心C字符串的细节,及大小分配问题。

9.相关参考
    <<C++标准程序库>> (侯捷/孟岩 译) 华中科技大学社

分享到:
评论

相关推荐

    关于C++字符转换的方法(pdf&source)

    这篇文档“关于C++字符转换的方法.pdf”以及相关的源代码“stringtest.cpp”将深入探讨这个主题。以下是一些核心知识点: 1. **字符类型**: C++提供了`char`类型来存储单个字符。它占据一个字节的空间,通常可以...

    c++字符转换

    本文将详细介绍C++中字符转换的方法及其应用场景,并特别关注于`CString`与`LPTSTR`之间的转换,以及其他相关类型如`char*`与`CString`的转换。 #### `CString`与`LPTSTR`之间的转换 **直接赋值** 在C++中,可以...

    各种 C++ 字符串类型转换

    本文将详细介绍几种常用的C++字符串类型(`char *`、`wchar_t*`、`_bstr_t`、`CComBSTR`、`CString`、`basic_string` 和 `System.String`)之间的转换方法,并通过示例代码加以解释。 #### 1. `char *` 类型转换 `...

    C++将文本字符串转换成BMP图片

    本篇文章将深入探讨如何使用C++编程语言将文本字符串转换成BMP(Bitmap)图片。 首先,我们需要了解BMP文件格式。BMP是Windows操作系统中常见的位图文件格式,它存储的是未经压缩的像素数据,包括图像宽度、高度、...

    C++字符串转换

    ### C++字符串转换详解 #### 一、概述 在C++编程中,字符串转换是非常常见的需求之一,尤其是在处理用户输入、文件操作等场景时。本文将详细介绍几种常见类型的字符串转换方法,包括`CString`, `int`, `string`, `...

    c++字符串加密解密

    以下是关于C++实现DES加密解密的相关知识点: 1. **DES算法介绍**: DES是一种块加密算法,它将64位的数据块(其中第8位用于奇偶校验,实际有效数据为56位)作为输入,经过16轮的迭代变换,最终得到64位的密文。...

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

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

    纯C++ 字符串处理函数大全源码

    4. `ToLower`/`ToUpper`:将字符串转换为小写或大写,常用于不区分大小写的比较。 5. `StartsWith`/`EndsWith`:检查字符串是否以指定的前缀或后缀开头或结束。 6. `Contains`:检测字符串中是否包含指定的子串。 7....

    c++ 字符串逆序输出

    c++ 字符串逆序输出 用vs2005打开

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

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

    字符串大小写转换的2种方法C++

    字符串大小写转换的2种方法C++,对任意输入的字符串可实现字符串大小写的转换。

    C++必知必会_c++类型转换_C++字符pdf_Vc_

    同时,C++也允许将其他数据类型转换为字符串,例如使用`std::stringstream`进行类型转换,或者利用`std::to_string()`函数将基本类型转换为字符串。相反,将字符串转换为其他类型,如整型或浮点型,可以使用`std::...

    详解C++ string常用截取字符串方法

    本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理需求。 1. `find`方法: `find`方法用于在字符串中查找指定子字符串`strSub`的第...

    c++ 字符串字符转16进制

    在C++编程中,将字符串中的每个字符转换成16进制值并输出是一项常见的任务。这涉及到对字符串的处理和数字的进制转换。在本文中,我们将深入探讨如何实现这一目标,以及相关的C++语言特性。 首先,我们要了解字符串...

    C++字符串完全指南

    本文档旨在提供一个全面的指南,帮助读者理解这些不同的字符串表示方式以及它们之间的转换方法。 **1. 字符编码类型** 在深入了解字符串之前,首先需要理解字符编码的概念。字符编码是将字符映射到二进制数字序列...

    关于托管C++和非托管C++各种字符串类型的转换

    ### 关于托管C++和非托管C++各种字符串类型的转换 #### 概述 本文将详细介绍托管C++(Managed C++)与非托管C++(Unmanaged C++)之间各种字符串类型转换的方法与技巧。虽然从表面上看这些转换操作似乎很简单,但...

    C++ 字符串操作

    在 C++ 中,字符串可以使用多种方式进行转换,包括使用构造函数、使用 GetAt 方法、使用 GetBuffer 方法等。CString 的 GetAt 方法可以得到 XCHAR,即与字符串类组成字符相同的字符。CString 的 GetBuffer 方法可以...

    C/C++ 字符表

    以上就是关于C/C++字符表的一些核心知识点。理解并熟练运用这些概念,对于编写处理文本数据的程序至关重要。通过实践和学习,你可以创建更复杂的字符处理功能,如统计字符串中特定字符的出现次数,检测字符串是否为...

    C++_string.rar_C++ 字符_字符串 c++_字符串类_字符串编码_字符编码

    C++字符串完全指引之一 Win32 字符编码 C++字符串完全指引之二 字符串封装类 详细介绍了c++字符编码和字符串相关类

Global site tag (gtag.js) - Google Analytics