使用sprintf实现类型转换
2009-08-24 20:52
295 查看
以下为我在编程的过程中用到sprintf,后查找资料及自己的一些总结。感谢网上资料的帮助。
在很多场合可以使用sprintf来实现类型转换,
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数.
比如
1. const char* 转换成char*
有时我们需要把string类型的字符串转换成char*,但是string.c_str()等到的结果是const char*类型而不是char*类型,转换方法就是先把string转换成const char*,然后用sprintf把const char*转换成char*
如:string str;
char* strchar;
const char* strC = str.c_str();
sprintf(strchar,"%s",str.c_str());
2.将int类型转换成char*
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
3.将浮点数转换成char*
但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m 表示打印的宽度,n 表示小数点后的位数。比如:
sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
4.实现字符串的连接
char* who = "I";
char* whom = "CSDN";
sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. "
使用sprintf 的常见问题
sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。
1 缓冲区溢出
第一个参数的长度太短了,没的说,给个大点的地方吧。当然也可能是后面的参数的问题,建议变参对应一定要细心,而打印字符串时,尽量使用”%.ns”的形式指定最大字符数。
2. 忘记了第一个参数低级得不能再低级问题,用printf 用得太惯了。
3. 变参对应出问题通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤其是对应”*”的那些参数,都提供了吗?不要把一个整数对应一个”%s”.
在很多场合可以使用sprintf来实现类型转换,
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数.
比如
1. const char* 转换成char*
有时我们需要把string类型的字符串转换成char*,但是string.c_str()等到的结果是const char*类型而不是char*类型,转换方法就是先把string转换成const char*,然后用sprintf把const char*转换成char*
如:string str;
char* strchar;
const char* strC = str.c_str();
sprintf(strchar,"%s",str.c_str());
2.将int类型转换成char*
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
3.将浮点数转换成char*
但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m 表示打印的宽度,n 表示小数点后的位数。比如:
sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
4.实现字符串的连接
char* who = "I";
char* whom = "CSDN";
sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. "
使用sprintf 的常见问题
sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。
1 缓冲区溢出
第一个参数的长度太短了,没的说,给个大点的地方吧。当然也可能是后面的参数的问题,建议变参对应一定要细心,而打印字符串时,尽量使用”%.ns”的形式指定最大字符数。
2. 忘记了第一个参数低级得不能再低级问题,用printf 用得太惯了。
3. 变参对应出问题通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤其是对应”*”的那些参数,都提供了吗?不要把一个整数对应一个”%s”.
相关文章推荐
- 使用sprintf实现类型转换
- 使用stringstream对象实现数据类型之间的转换
- C#中使用强制类型实现字符串和ASCII码之间的转换
- 使用C++ 标准库 stringstream实现各种数据类型之间的转换
- 使用 IL 实现类型转换
- 报错:对象必须实现 IConvertible;以分隔符进行分割链接concat_ws的使用方法;mysql数据类型转换cast,convert
- itoa与sprintf实现类型转换
- 关于字符和数字类型的索引,Oracle如何实现内部自动转换以及索引使用的验证测试
- swift--使用 is 和 as 操作符来实现类型检查和转换 / AnyObject与Any的区别
- C++使用模板实现数值型字符串类型间的转换
- C++中sprintf实现将一个基本数据类型的数组转换成字符串
- JAVAWEB开发之Struts2详解(二)——Action接受请求参数、类型转换器、使用Struts2的输入校验、以及遵守约定规则实现Struts2的零配置
- 使用stringstream对象实现数据类型之间的转换
- 关于字符和数字类型的索引,Oracle如何实现内部自动转换以及索引使用的验证测试
- C#中使用强制类型实现字符串和ASCII码之间的转换
- 使用stringstream对象实现类型转换实例
- 使用扩展方法实现枚举类型与数值类型的相互转换
- VC常用数据类型使用转换
- 使用Google的Gson实现对象和json字符串之间的转换
- 使用网络地址转换实现多服务器负载均衡