zoukankan      html  css  js  c++  java
  • 在使用strncpy, snprintf, strncat时,到底size要定义多大呢?

    一、strncpy

    char *strncpy(char *dst, const char *src, size_t n);

    功能:

            1)把src所指由结束的字符串的前n个字节复制到dest所指的数组中。   

            2)返回指向dest的指针(该指向dest的最后一个元素)

    说明:

            1)如果src的前n个字节不含,则结果不会以字符结束(strncpy 并不帮你保证 结束。)。如果src的长度小于n个字节,则以填充dst直到复制完n个字节。       

            2)src和dst所指内存区域不可以重叠,且dest必须有足够的空间来容纳src的字符串。  

    标准用法:

    char buf[80];
    strncpy(buf, src, sizeof(buf) - 1);
    buf[sizeof(buf) - 1] = '';  //手工写上 
    

    问题分析举例1:

    char buf[8];
    strncpy( buf, "abcdefgh", sizeof(buf) );
    

            这个程序里buf 将会被 "abcdefgh" 填满,但却没有 结束符了。

    问题分析举例2:

    char buf[80];
    strncpy( buf, "abcdefgh", sizeof(buf)-1 );
    

            如果 src的内容比较少,而 n 又比较大的话,strncpy 将会把之间的空间都用 填充。这就出现了一个效率上的问题,上面的 strncpy 会填写 79 个 char,而不仅仅是 "abcdefgh" 本身。在对性能要求高的地方使用时,需要考虑该问题。


    注:strcpy会拷贝

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char a[5];
        int i = 0;
        for (i = 0; i < 5; i++)
        {
            a[i] = -1;
        }
    
        strcpy(a, "123");
        printf("%c %c %c %d %d
    ", a[0], a[1], a[2], a[3], a[4]);
    }

    输出:1 2 3 0 -1

    二、snprintf

    int snprintf(char *str, size_t size, const char *format, ...);

    功能:

            将可变个参数(...)按照format格式化成字符串,然后将其复制到str中

    说明:

            1)如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('');

            2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符(''),返回值为欲写入的字符串长度。

            3)返回值是“如果有足够空间存储,所应能输出的字符数(不包括字符串结尾的'')”,例如可以写入的字符串是"0123456789ABCDEF"共16位,但是size限制了是10,这样 snprintf() 的返回值将会是16而不是10。

    举例:

    char rate[255] = { 0 };
    snprintf(rate, sizeof(rate), "%d", 123);
    

    这里size不需要-1,它是字符串拷贝唯一一个会截断并且会添''的函数

    三、strncat

    char *strncat(char *dest, const char *src, size_t n);

    功能:

            把src所指字符串的前n个字符添加到dest所指字符串的结尾处,从而实现字符串的连接(原dest所指字符串结尾的''将被覆盖)。如果src字符串长度大于n个字节,那么strncat只截取n个字节,并且会在字符串末尾添加''

    说明:

            src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串。

    返回值:

            返回指向dest的指针。

    标准用法:

    char buf[256] = { 0 };
    strncat(buf,"test",sizeof(buf)-strlen(buf)-1); //如果已知buf长度最好将strlen替代掉,耗性能。
    

    其中sizeof(buf)表示buf的总空间,strlen(buf)表示已经使用的空间,则sizeof(buf)-strlen(buf)-1表示剩余空间大小减一(预留的位置,但不需要手动填充)。如果该长度比src长很多,不会像strncpy那样将填充dst直到复制完n个字节。

    四、其他

    size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

    返回值:

            成功则返回输出字节数个数,失败返回0。

            若成功会自动补上''

            默认输出最大字节为max-1,因此传入参数时,sizeof 不用再减1。

    标准用法:

    ret = strftime(buf, sizeof(buf), "%Y-%m-%d", tm);
    if(ret == 0){
        printf("failed
    ");
    }
    
  • 相关阅读:
    对xml的操作使用的类XElement的使用
    在js和C#中split应用和去除字符串分组后的空值
    C# 预定义语言
    C# 中利用 Conditional 定义条件方法
    快速结束占用端口
    详解C++中命名空间的意义和用法
    Template、ItemsPanel、ItemContainerStyle、ItemTemplate
    C++入门(2)
    C++入门(1)
    VS中的配置管理器
  • 原文地址:https://www.cnblogs.com/realjimmy/p/12974472.html
Copyright © 2011-2022 走看看