[C++杂记] int转string
2015-03-10 08:43
1311 查看
int转string
现列出3中方法,各有优劣。1、多位整数转化为string
下面的代码片段展示的是正整数转化为string:
int low; string answer; while(n>0){ low = n % 10; n = n / 10; answer += low + '0'; } char temp; for(int i = 0; i < answer.length()/2; i++){ temp = answer[i]; answer[i] = answer[answer.length()-i-1]; answer[answer.length()-i-1] = temp; }如果是负整数,需要增加一个bool类型的值进行标记,然后将负数转化为正数之后进行string转化,最后在加上负号。如下:
<pre name="code" class="cpp">int n = -123480000;bool isNegative = false;if(n<0){n = -n;isNegative = true;}int low;string answer;while(n>0){low = n % 10;n = n / 10;answer += low + '0';}if(isNegative){answer += '-';}char temp;for(int i = 0; i < answer.length()/2; i++){temp = answer[i];answer[i]
= answer[answer.length()-i-1];answer[answer.length()-i-1] = temp;}cout << answer;
第3行到第7行判断需要转化的数是否为负数,如果是负数,那么需要将isNegative置为true,然后将负数取相反数。第16行到第18行根据isNegative的值,在字符串后加上负号,最后在将整个串取反,可以得到结果。
该方法的优点:效率较高
该方法的缺点:只可以处理整数,不可以处理浮点数。被转化的整数的范围必须在数据类型的值域范围之内,比如,要转化int型值,那么范围要在-2147483648到2147483647之间。
2、使用strstream或者stringstream函数
引用1说明了这两个函数在C++中的出处,其中strstream是基于C语言的char*的,而stringstream是基于C++的string的,其实现的功能大体相同。在这里我是如此记忆的,因为C++string类有一个函数是c_str(),该函数是将C++string类转化为C字符串char*的一个函数。于是,只要是包含str的,都属于基于C语言char*的,其余的属于基于C++的string的。
C语言 | C++ |
头文件<strstream> | 头文件<sstream> |
class strstreambuf | class stringbuf |
class istrstream | class istringstream |
class ostrstream | class ostringstream |
class strstream | class stringstream |
#include<strstream> using namespace std; int n = 65535; strstream ss; string s; ss << n; ss >> s; cout << s;
有些博客建议使用基于C++的<sstream>,使用方法是一样的。
关于为什么有些博客建议使用基于C++的<sstream>,解释说因为基于C语言的流可能在某些细节处理不好,可能逐渐会被废除。我实验了一个例子,作为例证。在vs2010中编写了一个程序片段,如下:
int _tmain(int argc, _TCHAR* argv[]) { double n = 635.866; strstream ss; string s; ss << n; s = ss.str(); cout << s << endl; stringstream ss1; ss1 << n; s = ss1.str(); cout << s << endl; system("pause"); return 0; }运行结果如下:
635.866屯屯屯屯屯屯屯屯屯屯屯屯妄
635.866
请按任意键继续. . .
可以看到,在使用基于C语言的<strstream>时,结果出现了问题。然而,将第6行的语句换位ss>>s,又不会出现问题。所以还是建议使用基于C++的<sstream>。
在使用基于C++的<sstream>时,我遇到了需要在while循环当中不断的将int型转为string型的问题。发现了stringstream在循环中不会及时清除内部的元素,而是不断累积。如下面代码所示:
#include<iostream> #include<string> #include<sstream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { <span style="white-space:pre"> </span>int n; <span style="white-space:pre"> </span>string s; <span style="white-space:pre"> </span>stringstream ss1; <span style="white-space:pre"> </span>cout << "input: "; <span style="white-space:pre"> </span>while( cin >> n ){ <span style="white-space:pre"> </span>ss1 << n; <span style="white-space:pre"> </span>s = ss1.str(); <span style="white-space:pre"> </span>cout << "output: " << s << endl; <span style="white-space:pre"> </span>cout << "input: "; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>system("pause"); <span style="white-space:pre"> </span>return 0; }输出结果为:
input: 12345
output: 12345
input: 67890
output: 1234567890
可以看到,最后一个output是累积了第一次循环中的数据的。有两种方法可以解决这个问题,第一种是在循环内部声明stringstream对象ss1,这样每次循环都会创建新的流对象,新的流对象内部为空。但是由于创建和销毁流对象非常占用资源,所以很低效。第二种方法是使用str("")函数,在使用流前清理上一次残留的数据。注意下面代码第14行。
#include<iostream> #include<string> #include<sstream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int n; string s; stringstream ss1; cout << "input: "; while( cin >> n ){ ss1.str(""); ss1 << n; s = ss1.str(); cout << "output: " << s << endl; cout << "input: "; } system("pause"); return 0; }为什么不可以使用clear()函数,而必须使用str("")呢?请大家参看引用3的博文。
该方法的优点:
很容易实现,代码量很少,仅仅需要调用几条语句就可以完成转化工作。而且可以批量完成大规模转化任务。
可以完成浮点数的转化。
该方法的缺点:
流的创建比较费资源,千万不可以在循环内部不断的新建流。
在转化浮点数时,指可以保留6位有效数字。(这点应该可以改变)
3、itoa函数
itoa函数时C语言的一个函数,函数原型为:
char *itoa( int value, char *string,int radix);
可以直接返回转化后的char*,也可以存储到第2个参数string中。
该方法的有点:非常简便,可以转化为不同进制。
该方法的缺点:只可以转化整型值
拓展:
itoa() 将整型值转换为字符串
litoa() 将长整型值转换为字符串
ultoa() 将无符号长整型值转换为字符串
引用:
1、网易博客 串口与网络知识 VC Delphi C++标准库中sstream和strstream的区别
2、bbs csdn
3、163博客 不要辜负 期望 stringstream clear()的误区
相关文章推荐
- C++杂记
- [杂记]C/C++ ·书籍·And More
- C++ Primer_顺序容器杂记
- C++学习杂记
- C、C++易错知识点杂记(4)
- C、C++易错知识点杂记(1)
- C++杂记 2011/12/12
- C++中int转string方法合辑
- c++ 杂记
- c++学习杂记(1)
- VS2005 C++ 手机开发杂记(上)
- C++杂记 05/08/2011 开始一个完整的WTL例子
- C++ int转string string转int 完美实现
- VS2005 C++ 手机开发杂记(下)
- c++学习杂记(2)
- c++学习杂记(4)
- C++杂记
- C++杂记 2011/12/13
- C、C++易错知识点杂记(3)
- 个人C++学习杂记