C++中字符串和int\float\char*类型的相互转换-Acm常用

Acm比赛中,常会有这方面的需求,虽然网上相关文章很多,但都不够综合,所以整理至此,方便自己也方便后人。

一、string和char*的互转(一般来说碰不到,但是顺便也写了吧)

1. char*->string

char* nodename="hello world";
string temp = nodename;
string temp2(nodename); 

2. string->char*,当然也有些其他的做法,但是看到说可能不安全,而且有些转换后是const的,不方便。看来看去还是这个最舒服。

string str="sdfgdsfgdf";
char s[100];
strcpy(s,str.c_str()); 

二、string转int的方式(代码均已考虑到负号和前导0的情况。参考:https://www.cnblogs.com/A-Little-Nut/p/8056421.html

    1. 按照十进制的特点进行算术运算得到int,简单的代码如下。

      int str2int(string a){ int res=0; if(a[0]!='-'){  res+=a[0]-'0';  }  for(int i=1;i<a.length();i++){  res*=10;  res+=a[i]-'0';  }  if(a[0]=='-'){  res*=-1;  }  return res;  } 

    2. 采用标准库(#include<stdlib.h>)中atoi函数。强烈建议比赛中使用此方法

      string s = "12"; 
      int a = atoi(s.c_str()); 

      对于其他类型也都有相应的标准库函数,比如浮点型atof(),long型atol()等等。

    3. 采用sstream头文件中定义的字符串流对象来实现转换。(#include <sstream> )

      istringstream is("12"); 
      int i; 
      is >> i; 

三、int转string的方式(若int有前导0,默认int为8进制)

  1. c++11标准增加了全局函数std::to_string(目前主流比赛都支持c++11,天梯赛这种甚至支持c++14)强烈建议比赛中使用此方法

    string to_string (int val);

    string to_string (long val);

    string to_string (long long val);

    string to_string (unsigned val);

    string to_string (unsigned long val);

    string to_string (unsigned long long val);

    string to_string (float val);

    string to_string (double val);

    string to_string (long double val);

  2. 自己实现,其中,max为n值的长度+1(参考:https://www.cnblogs.com/smile233/p/8379802.html
    string to_String(int n,int max){
    	int m = n;
    	char s[max];
    	char ss[max];
    	int i=0,j=0;
    	if (n < 0){
    		m = 0 - m;
    		j = 1;
    		ss[0] = '-';
    	}    
    	while (m>0){
    		s[i++] = m % 10 + '0';
    		m /= 10;
    	}
    	s[i] = '\0';
    	i = i - 1;
        while (i >= 0){
    		ss[j++] = s[i--];
    	}    
    	ss[j] = '\0';    
    	return ss;
     } 

  3. 借助字符串流。标准库定义了三种类型字符串流:istringstream,ostringstream,stringstream,看名字就知道这几种类型和iostream中的几个非常类似,分别可以读、写以及读和写string类型,它们也确实是从iostream类型派生而来的。要使用它们需要包含sstream头文件。强烈否认比赛中使用此方法

    除了从iostream继承来的操作

    1.sstream类型定义了一个有string形参的构造函数,即:  stringstream stream(s); 创建了存储s副本的stringstream对象,s为string类型对象

    2.定义了名为str的成员,用来读取或设置stringstream对象所操纵的string值:stream.str(); 返回stream中存储的string类型对象stream.str(s); 将string类型的s复制给stream,返回void

    int aa = 30;
    stringstream ss;
    ss<<aa; 
    string s1 = ss.str();
    cout<<s1<<endl; 

    此处,用ostringstream也可以。