strncpy、snprintf、sizeof、strlen

strncpy

------------------------------------------------------------------------------------------------------------------------------

strncpy的正确用法: 
    strncpy(dest, src, sizeof(dest));   //size一定要用sizeof(dest)或sizeof(dest)-1,不可误用sizeof(src)
   dest[sizeof(dest)-1] = ‘\0';            //务必要把dest的最后一个字节手工设置为0, 因为strncpy仅在src的长度小于dest时,对剩余的字节填0

(1) 当dest长度远大于src时,由于strncpy会对多余的每个字节填0,会有很大的性能损失

(2) strncpy返回dest,因而无法知道拷贝了多少个字节。


snprintf

------------------------------------------------------------------------------------------------------------------------------

int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...);

函数说明:最多从源串中拷贝n1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为n 的话,将不会溢出。

函数返回值:如果当前buf够用,返回实际写入的字符数;如果不够用,返回将要写入的字符数。换句话说,返回值就是传入的字符数目。

正确用法:

snprintf(dest, sizeof(dest), "%s", src);


实例如下:

    char str[10]={0,};

    snprintf(str, sizeof(str), "123456789012345678");       // str = 123456789    推荐用法

    snprintf(str, 8, "1234567890");                                         // str = 1234567        不推荐这样用


关于返回值:snprintf的返回值是欲写入的字符串长度,而不是实际写入的字符串度。

    ret1=snprintf(str1, sizeof(str1), "%s", "abc");                  // str = abc , ret  = 3

    ret2=snprintf(str2, 4, "%s", "aaabbbccc");                      // str2 =aaa, ret2 =9

    char test[8];

    int ret = snprintf(test,5,"1234567890");                          // test = 1234, ret = 10


关于性能:

当src长度远大于dest时,由于snprintf要返回src的字节数,需要扫描src,会有很大的性能损失。因此:

如果src远大于dest,用strncpy;如果dest远大于src,用snprintf。


strlen

------------------------------------------------------------------------------------------------------------------------------

函数功能:返回字符串的长度。

(1) strlen是函数,要在运行时才可以计算。

(2)从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'返回的长度大小不包括'\0'

(3) 参数必须是字符型指针(char*),且必须以 ‘\0’ 结尾。例:

    int ac[10];
    cout<<sizeof(ac)<<endl;
    cout<<strlen(ac)<<endl;  
  //错误:ac相当于一个指针,但是strlen只能接受char*类型,所以编译时出错

(4) 当数组名作为参数传入,实际上数组名就退化为指针了。 


sizeof

------------------------------------------------------------------------------------------------------------------------------

sizeof是运算符,在编译时已经计算好,因此不能用来返回动态分配的内存空间的大小。

当参数分别如下时,sizeof返回的值表示的含义如下:
(1) 数组——编译时分配的数组空间大小 (注意:数组做sizeof的参数不退化,传递给strlen就退化为指针了)

        char str[20]="0123456789";       
        int a=strlen(str);    // a=10; strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
        int b=sizeof(str);    // b=20; sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
(2) 指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);

        char* ss = "0123456789"; 
        sizeof(ss) ;              // 结果是 4; ss是指向字符串常量的字符指针,sizeof 获得的是一个指针所占的空间,应该是 长整型的,所以是4 
        sizeof(*ss) ;            // 结果是 1; *ss是第一个字符, 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类 型的,占了 1 位 
        strlen(ss);               //结果是 10;对于指向字符串的指针,如果要获得这个字符串的长度,则一定要使用 strlen。
(3) 类型——该类型所占的空间大小;
(4) 对象——对象的实际占用空间大小;
(5) 函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。

        short f(); 

        sizeof( f() );   // 结果是2

你可能感兴趣的:(strncpy、snprintf、sizeof、strlen)