几个基础函数及特性
2016-03-15 18:43
295 查看
snprintf
这个函数的返回值确实蛋疼,网上大多数说是“返回预期要写入的字符串长度”,那还有失败小于0的情况啊?其实,这样理解是比较好的:
什么时候写入成功?只有返回值 大于等于0,且小于长度限制n
因为snprintf最多copy n-1个字符,之后会在后面加入\0,所以实际正常下,写入的长度最多是n-1,那当然是小于n
strncat,strncpy
strcpy是从开始0位开始覆盖,而strcat是从当前buf字符结束\0处开始覆盖,最多copy n个,遇到\0结束copy。所以对于strncat要注意一般是strncat(buf, dest, BUF_SIZE - strlen(buf) - 1)关键是涉及字符串安全结束的问题:
strcat\strcpy\snprintf 在coyp的dest字符串远小于n的时候,都会将剩余的buf填充为0。
只是snprintf最多copy n-1个,而strcat、strcpy最多copy是n个,这样第n个除非恰好是0,否则,需要代码自己讲第n位写为0.
所以一般有两种写法:
1)总是在函数结束,将buf 第n为显式设为0,输入的n或n-1都无所谓,是否之前清空了也无所谓(显示设为0,可能之前已经copy了一个\0,)
#ifndef STRCPY #define STRCPY(d,s) do{ strncpy(d, s, sizeof(d)-1); d[sizeof(d)-1]=0; }while(0) #endif
2)先保证buf全部为空,输入时n-1即可,这样代码比较清晰简单。
sizeof
这个其实是关键字,是在编译时展开的特别要注意一定要用原型定义去计算size,特别注意的是指针指向的只能是指针的大小。
所以一般我们数组作为函数参数,必须带上大小。否则,可以传入数组指针:
int test(char (*p)[5]) { printf("->>>>>>>>>%d\n", sizeof(*p)); return 0; } int main() { char a[5]={'A','B','C','D'}; char (*p)[5] = &a; test(p); //或者用test(&a) 也可以 }
**这里如果是二维数组int a[][5],则为 char (*p)[5] = a;不用再给a取地址。**
引用
指针可以来回换着指多个对象,当然也可以改。但引用最好不要这样做,很别扭,加const吧。int a = 10; int c = 20; const int &b = a; //b = c; 通过此把a的值就修改为c的值了,const可以避免 printf("a = %d, c = %d\n", a, c);
数组及指针
这是一个老的话题了,指针我们一定先要清楚其三要素:地址、指向的地址、类型,而解引用p就是取指向地址内存的值
类型会影响指针的偏移,包括指针类似数组直接取下标p[i],等价于((p+i))
相关文章推荐
- Android RecyclerView 使用完全解析
- 《程序员修炼之道》——第二章 注重实效的途径(三)
- yii2.0 的数据的 改
- 安卓第十四天笔记-内容提供者(ContentProvider)
- 经典算法题一览
- JavaScript prototype of object
- (4.5.3.2)android studio编译项目,9 patch图片报错Crunching Cruncher
- 【项目 4:穷举法解决组合问题】
- Java - 动态代理
- 鼠标
- Gradle打jar包,包含所有依赖
- shell定时备份
- USB
- 《LINUX3.0内核源代码分析》第三章:内核同步(1)
- Google Summer of Code 2016 启动:现接受学生注册申请
- Google Summer of Code 2016 启动:现接受学生注册申请
- No Dialect mapping for JDBC type 错误分析
- run文件的安装
- butterknife简化android开发
- [倍增 floyd] BZOJ 2165 大楼