int,char,char*,char[],string的相互转换

int,char,char*,char[],string的相互转换

1.int与string

1.1.int->string

C++11增加了全局函数std::to_string

#include <string>

int a = 5;
string s = std::to_string(a);
/**除了int转string之外,还有其他类型转string*/
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);

1.2.string->int

1.2.1.string中的字符串整体 变为 int

有三种方法:

  • 采用标准库中atoi函数
  • 使用std::stoi/stol/stoll等函数
  • 采用sstream头文件中定义的字符串流对象来实现转换
1.2.1.1.采用标准库中的atoi函数
/**对于其他类型也都有相应的标准函数,比如浮点型atof(),long型atol()*/

/**如果字符串中含有数字之外的符号,那么a的值会是0,也就是atoi返回0*/
/**c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同,把字符串的'\0'去掉了*/
string s = "12";   
int a = atoi(s.c_str());
1.2.1.2.使用std::stoi/stol/stoll等函数

拿std::stoi举例

1.2.1.2.1.s中只有十进制写成的字符
/**s中含有十进制数字之外的字符,编译能通过但是运行会报错*/
string s = "12";   
int a = stoi(s); 
1.2.1.2.2.s中有除0-9之外的其他字符出现时,(并且 十进制数写成的字符出现在字符串的开始位置)
string s = "2001, A Space Odyssey";
string::size_type sz;  
int m_dec = stoi(s,&sz);///<只取 string中 前sz个字符 转换为 int 
/**sz智能判断 string中 最前面连在一起的字符是否 10进制数,是的话,将该十进制数所占的字符个数返回给sz(eg:此题,sz=4)*/
1.2.1.2.3.字符串为二进制形式数字
string str_bin = "10010110001";
int i_bin = std::stoi(str_bin,nullptr,2);///<2进制
1.2.1.2.4.字符串为十六进制形式数字
string str_hex = "40c3";
int i_hex = stoi (str_hex,nullptr,16);///<16进制
1.2.1.2.5.任意进制字符串
string str_auto = "0x7f";
int i_auto = std::stoi (str_auto,nullptr,0);///<智能判断进制
1.2.1.3.采用sstream头文件中定义的字符串流对象来实现转换
#include <sstream.h>

istringstream is("12"); ///<构造输入字符串流,流的内容初始化为“12”的字符串 ,头文件 sstream.h
int i; 
is >> i; //从is流中读入一个int整数存入i中

1.2.2.string中的字符串 按位从左到右 逐位变为 int

string s = "11111111111111111111111101101100";
cout << "s.size() = " << s.size() << endl;
int sz = s.size();
int a[32] = {};
///'\0'是ASCII码为0的字符,即字符串结点符,而'0'是数字字符'0',ASCII码是48
for (int i = 0; i < sz; ++i)
    a[i] = s[i] - '0';///<s[i]的类型为char,char类型可以进行类似整形的加减操作的 

2.int与cahr[]

2.1.int->char[]

/**函数: char*_itoa(int value,char* string,int radix);*/
/**参数说明编辑*/
/**value—–要转换的整形值*/
/**string—–转换后的字符串*/
/**radix——表示基数(2, 8, 10, 16)等进制基数 */

char buffer[20];
int i = 127;
itoa(i, buffer, 10);///<10进制数 转化为char[] ,以10进制形式保存在 char buffer[]中
cout << i << "\t" << buffer << endl;
/**
itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用的基数。在上例中,转换基数为10。10:十进制;2:二进制...
itoa并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。 
*/

/**
另一种全平台的方法,使用sprintf(printf也是可以的,就是进行标准化输出),参考网址https://blog.csdn.net/bat67/article/details/52063813
*/

2.2char[]->int

char *ch = "128";
int n = atoi(ch);
cout << ch << "\t" << n << endl;///<char*可以通过std::cout进行输出

3.string与char

3.1.string->char

/**使用下标进行元素获取*/
string mystr = "ABCD";
char mych = mystr[3];

3.2.char->string

3.2.1.使用构造函数string(n,‘c’)

char ch = 'x';
string str(1, ch); ///< 使用构造函数string(n, 'c')将字符串初始化为n个'c'字符的副本。

3.2.2.采用间接办法,借用char* 数组,使用string str(char* ,n)

char c = 'F';
char temp[1];
temp[0] = c;
string result(temp, 1); ///< string str(char*,n);取char数组 的前n个字符 到str中

4.string与char[]或char *

4.1.string->char[]

4.1.1.data()

string str = "hello";
const char* p = str.data();///< 加const 或者用char * p=(char*)str.data();的形式

4.1.2.c_str()

string str=“world”;
const char *p = str.c_str();///< 同上,要加const或者等号右边用char*

4.1.3.copy()

/**注意str的长度要大于要被复制到char* 的数据长度,否则会出先乱码*/
string str="hmmm";
char p[50];
str.copy(p, 5, 0);///< 这里5代表复制几个字符,0代表复制的位置,
*(p+5)=‘\0’;///< 注意手动加结束符!!!

4.2.char[]->string

string s;
char p[] = "hello";///<直接赋值,char p[]也可以换成 char *p
s = p;

猜你喜欢

转载自blog.csdn.net/xiaoxiaozengz/article/details/113735793