整型和字符串相互转换
整型和字符串相互转换
(2009-09-07 11:15:00)
标签:
整型字符串转换iotaatoisprintf用法教育 |
分类: 学习资料 |
我们写程序的时候经常会遇到整型和字符串相互转换的问题,这里要用到几个函数,itoa(),atoi(),sprintf()下面来介绍下这几个函数的具体用法!
itoa
{
int n;
char *str = "12345.67";
n = atoi(str);
printf("string = %s integer = %d\n", str, n);
return 0;
}
执行结果
string = 12345.67 integer = 12345
#include <stdlib.h>
#include <stdio.h>
int main()
{
char a[] = "-100" ;
char b[] = "123" ;
int c ;
c = atoi( a ) + atoi( b ) ;
printf("c = %d\n", c) ;
return 0;
}
执行结果
c = 23
0是 "填空字元" 表示,如果长度不足时就用0来填满。
6格式化后总长度
2f小数位长度,即2位
因为2f是(2位)+小数点符号(1)+前面123(3位)=6位,总长度为8位,故前面用[填空字元]0表示,即00123.10
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:
格式化字符串上。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐
short si = -1;
sprintf(s, "%04X", si);
印出负数,都是无符号的,实际上也就是变量的内部编码的直接的16 进制或8 进制表示。
浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符”%f”控制,默认保
留小数点后6 位数字,比如:
sprintf(s, "%f", 3.1415926); //产生"3.141593"
int i = 100;
sprintf(s, "%.2f", i);
会打出什么东东来?“100.00”?对吗?自己试试就知道了,同时也试试下面这个:
sprintf(s, "%.2f", (double)i);
第一个打出来的肯定不是正确结果,原因跟前面提到的一样,参数压栈时调用者并不知道跟i相对应的格式控制符是个”%f”。而函数执行时函数本身则并不知道当年被压入栈里的是个整数,于是可怜的保存整数i 的那4 个字节就被不由分说地强行作为浮点数格式来解释了,整个乱套了。不过,如果有人有兴趣使用手工编码一个浮点数,那么倒可以使用这种方法来检验一下你手工编排的结果是否正确。
printf("[ %c ]: %3d 0x%#04X\n", i, i, i);
}
sprintf(s, "%.*s%.*s", 7, a1, 7, a2);
或者:
sprintf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);
实际上,前面介绍的打印字符、整数、浮点数等都可以动态指定那些常量值,比如:
sprintf(s, "%-*d", 4, 'A'); //产生"65 "
sprintf(s, "%#0*X", 8, 128); //产生"0X000080","#"产生0X
sprintf(s, "%*.*f", 10, 2, 3.1415926); //产生" 3.14"
打印地址信息
较少有人注意printf/sprintf 函数的返回值,但有时它却是有用的,spritnf 返回了本次函数调用
最终打印到字符缓冲区中的字符数目。也就是说每当一次sprinf 调用结束以后,你无须再调用一次
strlen 便已经知道了结果字符串的长度。如:
int len = sprintf(s, "%d", i);
对于正整数来说,len 便等于整数i 的10 进制位数。
下面的是个完整的例子,产生10 个[0, 100)之间的随机数,并将他们打印到一个字符数组s 中,
以逗号分隔开。
#include
#include
#include
int main() {
srand(time(0));
char s[64];
int offset = 0;
for(int i = 0; i < 10; i++) {
offset += sprintf(s + offset, "%d,", rand() % 100);
}
s[offset - 1] = '\n';//将最后一个逗号换成换行符。
printf(s);
return 0;
}
设想当你从数据库中取出一条记录,然后希望把他们的各个字段按照某种规则连接成一个字
符串时,就可以使用这种方法,从理论上讲,他应该比不断的strcat 效率高,因为strcat 每次调用
都需要先找到最后的那个’’的位置,而在上面给出的例子中,我们每次都利用sprintf 返回值把这
个位置直接记下来了。(话说这一段我也没看懂,先发上来再研究吧~~~)
sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访
问错误,但好在由sprintf 误用导致的问题虽然严重,却很容易找出,无非就是那么几种情况,通
常用眼睛再把出错的代码多看几眼就看出来了。
第一个参数的长度太短了,没的说,给个大点的地方吧。当然也可能是后面的参数的问
题,建议变参对应一定要细心,而打印字符串时,尽量使用”%.ns”的形式指定最大字符数。
低级得不能再低级问题,用printf 用得太惯了。//偶就常犯。:-)
通常是忘记了提供对应某个格式符的变参,导致以后的参数统统错位,检查检查吧。尤
其是对应”*”的那些参数,都提供了吗?不要把一个整数对应一个”%s”,编译器会觉得你
欺她太甚了(编译器是obj 和exe 的妈妈,应该是个女的,:P)。
sprnitf 还有个不错的表妹:strftime,专门用于格式化时间字符串的,用法跟她表哥很像,也
是一大堆格式控制符,只是毕竟小姑娘家心细,她还要调用者指定缓冲区的最大长度,可能是为
了在出现问题时可以推卸责任吧。这里举个例子:
整型和字符串相互转换相关推荐
- C++ 整型和字符串相互转换
C++ 整型和字符串相互转换 本博客转载自:http://blog.csdn.net/u012400584/article/details/53898287,只转载了部分内容. itoa 功 能:把一 ...
- MySQL中整型和字符串类型指定长度的含义
引入: int(5)和char(5)或者varchar(5)中的数字指的是什么意思?是字节数,还是字符长度?为什么在整型中指定了int(5)却可以输入123456? 答案是后者,不管是整型还是字符串类 ...
- [转载] Java 中字符串转整型和整型转字符串
参考链接: Java中的字符串到整数– parseInt() Java 中字符串转整型和整型转字符串 1.字符串转整型Java代码,字符串为纯数字的情况下,调用Integer的静态方法parseInt ...
- Java 中字符串转整型和整型转字符串
Java 中字符串转整型和整型转字符串 1.字符串转整型 Java代码,字符串为纯数字的情况下,调用Integer的静态方法parseInt或者valueOf Java代码,如果单个字符或字符串,需要 ...
- Java中字符串转整型和整型转字符串
标签(空格分隔): Java 大多数情况下,用户通过文本框或者文本域提交自己的输入.用户通过文本框或文本域输入的内容通常是string格式的.而你常常需要的是这些内容的整数形式.例如,年龄,电话号码等 ...
- java中将整型转换为字符型_JAVA的整型与字符串相互转换
JAVA的整型与字符串相互转换 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Int ...
- matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......
1.2.1 什么是变量和变量名 变量这个词似乎在许多地方都有出现,在计算机中变量是指是一段有名字的连续存储空间(摘自百度百科),而这个所谓的名字就叫做变量名.举个例子说现在我们再MATLAB的命令窗口 ...
- python字符串转日期_python 日期、时间、字符串相互转换
python 日期.时间.字符串相互转换 在python中,日期类型date和日期时间类型dateTime是不能比较的. (1)如果要比较,可以将dateTime转换为date,date不能直接转换为 ...
- js对象与字符串相互转换
js对象与字符串相互转换 对象转为字符串 const obj = {id: 0,name: '张三',age: 12 } const objToStr = JSON.stringify(obj) co ...
最新文章
- 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)
- matlab simulink 求解连续微分系统 混沌系统
- auto-sklearn手册
- 前端数据可视化可绘制地图等插件:Highcharts、Echarts和D3
- 肝货!你想要的资源这里都有!
- Java9 jar兼容_java9新特性-6-多版本兼容jar包
- js获取今天剩余时间_js动画,setTimeout/setInterval的不准确
- 邬贺铨/余晓晖/田溯宁…千家从业者,数十位行业大咖共同烹制了一场怎样的AIoT“盛宴”?
- openstack虚拟机迁移live-migration中libvirt配置
- Openstack+Kubernetes+Docker微服务实践之路--基础设施
- 【随感】我觉得,世界上最美好的乐器是钢琴和架子鼓
- python中nameerror怎么处理_python中的错误如何查看
- c语言跑酷小游戏代码,跑酷游戏代码
- 实验七matlab数值计算,数学应用软件实验报告---MATLAB的数值计算
- linux刷新本地dns命令_如何刷新本地DNS缓存
- 微软邮箱服务器出问题了,在微软邮箱登录时常见的问题有哪些
- 67 Ways to Increase Conversion with Cognitive Biases
- ASC制动效果成因个人理解
- 三星手机和计算机如何连接打印机,三星打印机连接到电脑没反应怎么办
- 中石油即时通手机版显示服务器登录失败,中石油即时通手机最新版app