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”以及相关的源代码“stringtest.cpp”将深入探讨这个主题。以下是一些核心知识点: 1. **字符类型**: C++提供了`char`类型来存储单个字符。它占据一个字节的空间,通常可以...
本文将详细介绍C++中字符转换的方法及其应用场景,并特别关注于`CString`与`LPTSTR`之间的转换,以及其他相关类型如`char*`与`CString`的转换。 #### `CString`与`LPTSTR`之间的转换 **直接赋值** 在C++中,可以...
本文将详细介绍几种常用的C++字符串类型(`char *`、`wchar_t*`、`_bstr_t`、`CComBSTR`、`CString`、`basic_string` 和 `System.String`)之间的转换方法,并通过示例代码加以解释。 #### 1. `char *` 类型转换 `...
本篇文章将深入探讨如何使用C++编程语言将文本字符串转换成BMP(Bitmap)图片。 首先,我们需要了解BMP文件格式。BMP是Windows操作系统中常见的位图文件格式,它存储的是未经压缩的像素数据,包括图像宽度、高度、...
### C++字符串转换详解 #### 一、概述 在C++编程中,字符串转换是非常常见的需求之一,尤其是在处理用户输入、文件操作等场景时。本文将详细介绍几种常见类型的字符串转换方法,包括`CString`, `int`, `string`, `...
以下是关于C++实现DES加密解密的相关知识点: 1. **DES算法介绍**: DES是一种块加密算法,它将64位的数据块(其中第8位用于奇偶校验,实际有效数据为56位)作为输入,经过16轮的迭代变换,最终得到64位的密文。...
总结,C++中字符和字符串的转换涉及多种方法和函数,包括使用`std::string`,处理宽字符,以及转换不同的编码格式。了解和熟练掌握这些转换技巧对于编写跨平台的、处理各种字符集的C++程序至关重要。实践中的应用...
4. `ToLower`/`ToUpper`:将字符串转换为小写或大写,常用于不区分大小写的比较。 5. `StartsWith`/`EndsWith`:检查字符串是否以指定的前缀或后缀开头或结束。 6. `Contains`:检测字符串中是否包含指定的子串。 7....
c++ 字符串逆序输出 用vs2005打开
在C++编程中,将JSON字符串转换为C++类对象是一项常见的任务,特别是在处理网络通信、数据存储或配置文件时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析...
字符串大小写转换的2种方法C++,对任意输入的字符串可实现字符串大小写的转换。
同时,C++也允许将其他数据类型转换为字符串,例如使用`std::stringstream`进行类型转换,或者利用`std::to_string()`函数将基本类型转换为字符串。相反,将字符串转换为其他类型,如整型或浮点型,可以使用`std::...
本文将详细解析两种常用的C++ `std::string`截取字符串的方法:`find`和`find_last_of`,以及如何结合使用它们来满足各种字符串处理需求。 1. `find`方法: `find`方法用于在字符串中查找指定子字符串`strSub`的第...
在C++编程中,将字符串中的每个字符转换成16进制值并输出是一项常见的任务。这涉及到对字符串的处理和数字的进制转换。在本文中,我们将深入探讨如何实现这一目标,以及相关的C++语言特性。 首先,我们要了解字符串...
本文档旨在提供一个全面的指南,帮助读者理解这些不同的字符串表示方式以及它们之间的转换方法。 **1. 字符编码类型** 在深入了解字符串之前,首先需要理解字符编码的概念。字符编码是将字符映射到二进制数字序列...
### 关于托管C++和非托管C++各种字符串类型的转换 #### 概述 本文将详细介绍托管C++(Managed C++)与非托管C++(Unmanaged C++)之间各种字符串类型转换的方法与技巧。虽然从表面上看这些转换操作似乎很简单,但...
在 C++ 中,字符串可以使用多种方式进行转换,包括使用构造函数、使用 GetAt 方法、使用 GetBuffer 方法等。CString 的 GetAt 方法可以得到 XCHAR,即与字符串类组成字符相同的字符。CString 的 GetBuffer 方法可以...
以上就是关于C/C++字符表的一些核心知识点。理解并熟练运用这些概念,对于编写处理文本数据的程序至关重要。通过实践和学习,你可以创建更复杂的字符处理功能,如统计字符串中特定字符的出现次数,检测字符串是否为...
C++字符串完全指引之一 Win32 字符编码 C++字符串完全指引之二 字符串封装类 详细介绍了c++字符编码和字符串相关类