zoukankan      html  css  js  c++  java
  • 几个基础函数及特性

    snprintf

    这个函数的返回值确实蛋疼,网上大多数说是“返回预期要写入的字符串长度”,那还有失败小于0的情况啊?
    其实,这样理解是比较好的:
    什么时候写入成功?只有返回值 大于等于0,且小于长度限制n
    因为snprintf最多copy n-1个字符,之后会在后面加入,所以实际正常下,写入的长度最多是n-1,那当然是小于n

    strncat,strncpy

    strcpy是从开始0位开始覆盖,而strcat是从当前buf字符结束处开始覆盖,最多copy n个,遇到结束copy。所以对于strncat要注意一般是strncat(buf, dest, BUF_SIZE - strlen(buf) - 1)

    关键是涉及字符串安全结束的问题:
    strcatstrcpysnprintf 在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了一个,)

    #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
    ", 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
    ", a, c);
    

    数组及指针

    这是一个老的话题了,指针我们一定先要清楚其三要素:地址、指向的地址、类型,
    而解引用p就是取指向地址内存的值
    类型会影响指针的偏移,包括指针类似数组直接取下标p[i],等价于(
    (p+i))

  • 相关阅读:
    git的使用
    模块化的 require 和 import的区别
    Javascript模块化编程(二)commonJS规范和AMD规范
    Javascript模块化编程(三):require.js的用法
    SQL精华语句
    Convert sql 函数格式
    sql分页存储过程(汇总)
    jira和svn结合
    使用Java Service Wrapper 把Java程序作为Windows系统服务
    Eclipse使用技巧
  • 原文地址:https://www.cnblogs.com/leby/p/snprintf.html
Copyright © 2011-2022 走看看