欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 23:35:10
...

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

因为本人参加算法类比赛,会有题目有这方面的需求,虽然网上文章很多,但都不够综合,所以整理至此,方便自己也方便后人。

至于long\double等转成string类型,这里不再赘述

一、string和char*的互转

1. char*->string

const char* nodename;
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(i,1,a.length()){
              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)

    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也可以。

  4. (未完待续)