strncpy 和 strcpy的区别 (要抽时间重点看,未完待续)

strcpy的实现:
 //GNU-C中的实现(节选):
  */
  char* strcpy(char *d, const char *s)
  {
    char *r=d;
    while((*d++=*s++));
    return r;
  }
  /* while((*d++=*s++)); 的解释:赋值表达式返回左操作数,所以在复制NULL后,循环停止 */
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针
 
 
 
strncpy
 
char * strncpy( char *dest, char *src, size_t num );
(c/c++)复制src中的内容(字符,数字、汉字....)到dest,复制多少由num的值决定,返回指向dest的指针。如果遇到null字符('\0'),且还没有到num个字符时,就用(num - n)(n是遇到null字符前已经有的非null字符个数)个null字符附加到destination。注意:并不是添加到destination的最后,而是紧跟着由source中复制而来的字符后面。下面举例说明[1]:
1
2
3
char des[] = "Hello,i am!";
char source[] = "abc\0def";
strncpy(des,source,5);
此时,des区域是这样的:a,b,c,\0,\0,逗号,i,空格,a,m,!
注意:\0,\0并不是添加在!的后面。

实现

 char *strncpy(char *dest, const char *src, int n)
 {
     char c;
     char *s = dest;
     )
     {
         size_t n4 = n >> ;
         for (;;)
         {
             c = *src++;
             *dest++ = c;
             if (c == '\0')
                 break;
             c = *src++;
             *dest++ = c;
             if (c == '\0')
                 break;
             c = *src++;
             *dest++ = c;
             if (c == '\0')
                 break;
             c = *src++;
             *dest++ = c;
             if (c == '\0')
                 break;
             )
                 goto last_chars;
         }
         n -= dest - s;
         goto zero_fill;
     }
 last_chars:
     n &= ;
     )
         return s;
     for (;;)
     {
         c = *src++;
         --n;
         *dest++ = c;
         if (c == '\0')
             break;
         )
             return s;
     }
 zero_fill:
     )
         dest[n] = '\0';
     return s;
 }

与strcpy的区别

Strcpy和Strncpy的区别- -
第一种情况:

char* p="how are you ?";
]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name改变为"how are you ? "====>正确!
strncpy(name,p, sizeof(name));//name改变为"how are you ?" =====>正确!后续的字符将置为NULL

第二种情况:

char* p="how are you ?";
];
strcpy(name,p); //目标串长度小于源串,错误!
name[]='\0'; //和上一步组合,弥补结果,但是这种做法并不可取,因为上一步出错处理方式并不确定
strncpy(name,p,sizeof(name)); //源串长度大于指定拷贝的长度sizeof(name),注意在这种情况下不会自动在目标串后面加'\0'
name[]='\0'; //和上一步组合,弥补结果
上一篇:commons工具类


下一篇:图论(floyd算法):NOI2007 社交网络