[C++杂记] int转string

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
下面的代码使用了基于C语言的<strstream>来实现了int到string的转化:
#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++杂记] int转string)