C和C++中的数字与字符串的转换
用过java的人都知道,java众多的方法能够非常方便的进行数字和字符串之间的转换,而C和C++就麻烦多了。
其实不然,C和
C++也是提供了方便的方法进行转换,不必手写。
1.字符串格式化函数:sscanf和sprintf(stdio.h)
函数原型:
int sscanf( const char *, const char *, ...);
int sscanf(const char *buffer,const char *format,[argument ]...);
buffer 存储的数据
format 格式控制字符串
argument 选择性设定字符串
sscanf会从buffer里读进数据,依照argument的设定将数据写回。
成功则返回参数数目,失败则返回0,错误原因存于errno中。
其实sscanf和scanf基本一样,只不过scanf是从输入流读取数据,sscanf从字符数组buffer读取数据,而格式控制字符串format与scanf基本一样,同样可以使用扫描集进行读取操作。format的具体说明可以参考我的博文:http://www.cnblogs.com/ay27/archive/2012/11/15/2771425.html
函数原型:
int sprintf( char *buffer, const char *format, [ argument] … );
buffer 存储的数据
format 格式控制字符串
argument 选择性设定字符串
sprintf会从argument中读取数据,按照format格式写入到buffer中。
最后sprintf返回字符串的长度,相当于一次strlen的调用。
至于format也是与printf基本一样。
有这两个函数基本上可以解决多数的字符串和数字转换的问题了,不过这两个函数有时会发生一些很奇怪的问题。这时我们可以用库里边的转换函数。
2.字符串转数字(atoi,atol,atof)(stdlib.h)
函数原型:
int atoi(const char *nptr);
long atol(const char *nptr);
double atof(const char *nptr);
从函数的返回值可以看出它们对应的数据类型了,这个转换非常好用,基本上不会怎么出现莫名其妙的错误,当然nptr数组要设置好了的情况下。
至于strtol,strtoul,strtod等的函数是上面几个的增强版,主要能够处理多种进制方式的数据,只给出函数原型,具体不多说。
函数原型:
long strtol(const char *nptr, char **endptr, int base); //nptr存储的数据,endptr存储非法数据(若为NULL则不返回非法数据),base是进制方式(从2到36,比如16就是采取16进制方式存储)
double strtod(const char *nptr,char **endptr);
unsigned long strtoul(const char *nptr,char **endptr,int base);
3.C++风格的stringstream(字符串流)(sstream)
double xx = 23.5;
stringstream s;
s<<xx; //将xx转换成字符串流s
cout<<s.str()<<endl; //将字符串流输出
double yy;
s>>yy; //将字符串流转换成数字
cout<<yy<<endl;
这样还用什么可说的呢?