C/C++中经常会使用到基本数据类型与字符串(char*)类型的相互转换,我在这里总结一下我学到的几种转换方法,欢迎补充和纠错。
一. 从其他基本数据类型到字符串
方法(1): 使用stdio.h库中的snprintf函数, 将格式化字符串写到char数组
原型:
int snprintf ( char * s, size_t n, const char * format, ... );
参数:
s : 目标字符数组
n: 最大可以写到s中的字符数(包含结尾'\0'字符)
format: 格式化字符串
返回值:
成功时返回写到字符数组中的字符数(结尾的'\0'字符不算在里面),失败时返回负数
示例代码
char s[1000];
int n = snprintf(s, 1000,"%f %d %s", 0.33, 22, "hello");
printf("written char number: %d\nresult string: %s\n", n, s);
return 0;
优点:简单直接
缺点:溢出时会发生截断,而且还必须使用正确的格式化字符串,否则会导致不可预知的结果。
方法二(2)使用<sstream>库的stringstream 或ostringstream对象
a. stringstream对象可用于输入和输出流
b. ostringstream对象只用于输出流
ostringstream示例代码:
ostringstream ostream;
ostream<<22<<" "<<0.33;
cout<<ostream.str()<<endl
stringstream示例代码:
stringstream stream;
stream<<22<<" "<<0.33;
cout<<stream.str()<<endl;
注意: str是stream对象的成员方法,它有以下两个原型:
string str() const; void str (const string& s);第一个原型,是返回当前流内容的字符串。
第二个原型会先清空当前流的内容,然后将s设置为当前流内容。
优点:由编译器进行类型安全检查,简单又安全
缺点:stream对象的构造和析构耗费时间,但是可以通过使用clear后对stream对象进行复用来提高效率。
二. 从字符串到其他基本数据类型
方法(1):使用<stdio.h>的sscanf函数,从给定字符串格式化读入数据
<strong> </strong> int a;
double b;
char s[1000];
sscanf("12 33.33 hello", "%d%lf%s", &a, &b, &s);
cout<<a<<" "<<b<<" "<<s<<endl;
优点:简单直接。
缺点:必须使用正确的格式化字符串,否则会导致不可预知的结果。
方法(2): 使用<sstream>库的stringstream 或istringstream对象
a. stringstream对象可用于输入和输出流
b. istringstream对象只用于输入流
stringstream示例代码:
int a;
double b;
char s[1000];
stringstream stream("22 0.33 hello");
//or stream.str("22 0.33 hello");
stream>>a>>b>>s;
cout<<a<<" "<<b<<" "<<s<<endl;
istringstream示例代码:
int a;
double b;
char s[1000];
istringstream istream("22 0.33 hello");
//or stream.str("22 0.33 hello");
istream>>a>>b>>s;
cout<<a<<" "<<b<<" "<<s<<endl;
注意:
(1)转换时,每个对象都以空格或tab或换行符作为分割符。
(2)若要复用stringstream对象(每遇到一次作为输入流然后紧接着再作为输出流,那就是不同的两次), 在这之间要调用clear成员函数。
方法(3):使用<stdlib.h>库中的atoi、atol、strtod、strtof、strtol等,其中str开头的函数还支持进制转换,还支持从任意字符串转换(也就是说字符串不一定是纯数字的)。