您的位置:首页 > 其它

几个基础函数及特性

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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: