c++中的字符串转为int,字符串split(弱爆了)

//(1)字符串类型转化为整数型(Integer),还是字符串类型(String)转化为Double类型,这在java里面有非常好的内部函数,很easy的事情;
//(2)但是在c里面没有Integer Double等包装类,由char[]数组转化为整数型就变得不那么简单了,atoi()  itoa()在widows下面有,但是网上说linux 下好像没有 itoa() 函数,用 sprintf() 好了,但是本人测试了一下sprintf()  sscanf()的效率很低。
//(3)所以自己手动实现了一下atoi()(字符串转整数)  itoa(整数转字符串)两个函数,有哪里不对的地方,大家指正。
//c++实现atoi() itoa()函数(下面的是之前写的,感觉好幼稚,不过挺全的,用到了sprintf,sscanf stringstream 还是非常不错的

#include <sstream>
#include <iostream>
#include <stdio.h>
const int N = 10;
int main()
{
    std::stringstream ss;
    int first, second;
	double d;
	char Istr[N],Dstr[N];
	//string to any
	ss << "456";
    ss >> first; //转换成int 
	std::cout << "string to int:";
    std::cout << first << std::endl;


    ss.clear(); //在进行多次转换前,必须清除ss
    ss << true; //插入bool值
    ss >> second; //提取出int
	std::cout << "bool to int:";
    std::cout << second << std::endl;


	ss.clear();
	ss << "123.34";
	ss >> d;
	std::cout << "string to double:";
    std::cout << d << std::endl;
	


	//any to string


	ss.clear();
	ss << 8888;
	ss >> Istr;
	std::cout << "int to string:";
    std::cout << Istr << std::endl;


	ss.clear();
	ss << 1234.56;
	ss >> Dstr;
	std::cout << "double to string:";
	std::cout << Dstr << std::endl;
	
	//上面方法很简便, 缺点是处理大量数据转换速度较慢..
   //C library中的sprintf, sscanf 相对更快
  //可以用sprintf函数将数字输出到一个字符缓冲区中. 从而进行了转换
   printf("*********上面是stringstream( << , >> ),下面是sscanf()和sprintf()*********");


	//新的转换方法
	char s[] = "15.455";
	int i;
	float f;
	sscanf(s,"%d",&i);//string to int,直接舍去小数部分
	sscanf(s,"%f",&f);//string to double


	printf("string to int:Integer = %d\n",i);
	printf("string to double:Real = %f\n",f);




	int seconds = 1000000000;
	int H, M, S;
 
    H=(seconds/3600)%24;
    M=(seconds%3600)/60;
    S=(seconds%3600)%60;
    char ctime[10];
    sprintf(ctime, "%d:%d:%d", H, M, S);             // 将整数转换成字符串
    printf("int to string:%s\n",ctime);             // 结果 


} 


  */




/*
#include <ctype.h>
#include <stdio.h>


int atoi (char s[])
{
int i,n,sign;
for(i=0;isspace(s[i]);i++)//跳过空白符;
sign=(s[i]=='-')?-1:1;
if(s[i]=='+'||s[i]==' -')//跳过符号
 i++;
for(n=0;isdigit(s[i]);i++)
      n=10*n+(s[i]-'0');//将数字字符转换成整形数字
return sign *n;
}


void itoa (int n,char s[])
{
int i,j,sign;
if((sign=n)<0)//记录符号
n=-n;//使n成为正数
i=0;
do{
      s[i++]=n%10+'0';//取下一个数字
}
while ((n/=10)>0);//删除该数字
if(sign<0)
s[i++]='-';
s[i]='\0';
for(j=i;j>=0;j--)//生成的数字是逆序的,所以要逆序输出
      printf("%c",s[j]);
} 


//atoi 函数:将s转换为整形数
int main(void )
{ 
int n;
char s[100];
printf("Input n:\n");
scanf("%d",&n);
printf("the string : \n");
itoa (n,s);
return 0;
}
*/


// compare traslate time


#include <sstream> //stringstream


using namespace std;


#include <ctime>//clock()
#include <cstdio> //sscanf()


const int N = 15;
int myloop = 1000000;


int main()
{
	clock_t t;
	int t_start, t_end;
	char istr[] = "1234567890";//10位
	char dstr[] = "1234.56789";//10位
	char str[N];
	int i,temp,str_len;
	double d;
	stringstream ss;
	
	temp = myloop;
	/*
	//1 stringstream
	t_start = clock();
	while (myloop--)
	{
		ss << istr;
		ss >> i;// string to int
		//ss << dstr;
		//ss >> d;//string to double
		ss.clear();
	}
	t_end = clock();
	t = t_end - t_start;
	printf("string(%s) to int(%d),using method of stringstream time: %d\n",istr,i,t);
	//printf("string(%s) to double(%lf),using method of stringstream time: %d\n",dstr,d,t);
    */
    //1 sscanf (这个比stringstream快十多倍)
	myloop = temp;
	t_start = clock();
	while(myloop--)
	{
		sscanf(istr,"%d",&i);//strint to int
		//sscanf(dstr,"%lf",&d);//strint to double f 3位有效,lf 6 位有效
	}
	t_end = clock();
	t = t_end - t_start;
	printf("string(%s) to int(%d),using method of sscanf() time: %d\n",istr,i,t);
	//printf("string(%s) to double(%lf),using method of sscanf() time: %d\n",dstr,d,t);
    /*
	//2 stringstream 竟然在double 处,失真了。
	myloop = temp;
	ss.clear();
	t_start = clock();
	while (myloop--)
	{
		ss << i;
		ss >> str;// int to string
		//ss << d;//用上面的d
		//ss >> str;//double to string
		ss.clear();
	}
	t_end = clock();
	t = t_end - t_start;
	printf("int(%d) to string(%s),using method of stringstream time: %d\n",i,str,t);
	//printf("double(%f) to string(%s)00 ,using method of stringstream time: %d\n",d,str,t);
    */
    //2 sprintf比stringstream 快十多倍
	myloop = temp;
	t_start = clock();
	while(myloop--)
	{
		sprintf(str,"%d",i);//int to string
		//sprintf(str,"%lf",d);// double to string
	}
	t_end = clock();
	t = t_end - t_start;
	printf("int(%d) to string(%s),using method of sprintf() time: %d\n",i,str,t);
	//printf("double(%lf) to string(%s),using method of sprintf() time: %d\n",d,str,t);


	//自编自写的转化(最快,比sscanf快不到10倍) string to int;
	myloop = temp;
	str_len = strlen(istr);
	//printf("%d\n",str_len);
	int j,mi,s;
	t_start = clock();
	while(myloop--)
	{
		mi = 1;
		s=0;
		for(j=str_len-1;j>=0;j--)
		{
			s += (istr[j]-48)*mi;
			mi *= 10;
		}
	}
	t_end = clock();
	t = t_end - t_start;
	printf("string(%s) to int(%d),using method of ziji time: %d\n",istr,s,t);
	//printf("string(%s) to double(%lf),using method of stringstream time: %d\n",dstr,d,t);




	//自编自写的转化(最快,比ssprintf快一点点) int to string;
	myloop = temp;
	int ti;//用于i的值
	t_start = clock();
	while(myloop--)
	{
		mi = 1;
		ti = i;
		for(j=0;ti>0;j++)
		{
			str[j] = ti%10+48;
			ti /= 10;
		}
	}
	t_end = clock();
	t = t_end - t_start;
	//printf("********");
	printf("int(%d) to string(%s)  ,using method of ziji time: %d\n",i,str,t);
	//printf("double(%lf) to string(%s),using method of stringstream time: %d\n",d,str,t);
	
	return 0;
}


你可能感兴趣的:(C++,String,int)