C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlenC语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen
实实C/C++中的字符串操作函是实实功的数很内,实看着实些函实实数很,自己实实起来,实是有实多地方需要考实的,所以立实的朋友没独写,可以自己敲敲看 . --By Crazybabystrcpy:
[cpp] view plaincopyprint?
1.char* cb_strcpy(char* dst, const char* src) {
2.
3. assert((dst!=NULL) ...
C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen
实实C/C++中的字符串操作函是实实功的数很内,实看着实些函实实数很,自己实实起来,实是有实多地方需要考实的,所以立实的朋友没独写,可以自己敲敲看 . --By Crazybabystrcpy:
[cpp] view plaincopyprint?
1.char* cb_strcpy(char* dst, const char* src) {
2.
3. assert((dst!=NULL) && (src!=NULL));
4.
5. char* retAddr = dst; /**< retAddr is in static , char retAddr[] will in Stack,
So... */
6. while ((*(dst++) = *(src++))!='\0') {
7. ;
8. }
9.
10. return retAddr;
11.}
strncpy:
[cpp] view plaincopyprint?
1.char* cb_strncpy(char* dst, const char* src, size_t size) {
2.
3. assert((dst!=NULL) && (src!=NULL));
4.
5. char* retAddr = dst; /**< retAddr is in static , char retAddr[] will in Stack,
So... */
6. int i = 0;
7. while (((*(dst++) = *(src++))!='\0') && ((i++) < size)) {
8. ;
9. }
10.
11. *(retAddr+size)='\0'; /**< cut off String */
12.
13. return retAddr;
14.}
实个strncpy实实版本 和 stdlib.h 下的 strncpy 实是有实的区, 比如
[cpp] view plaincopyprint?
1.char a[30];
2.strncpy(a, "Hello", 28); //a除了有Hello,之后有会23个repeat '\0' . 实实有效率的会
实实.
3.
4.char b[30];
5.cb_strncpy(b, "Hello", 28); // 而只有 Hello'\0' CB: strncpy相实于strcpy来实 ,安全性提高了一等实 个. 另个个外一要非常注意的地方那是 strcpy 和 strncpy 都遇到 会'\0' 实束.
外另:当实求的目实地址空实比源字符串空实要小的实候~strncpy 将不再用”\0”来实束字符串。实是一巨大的实患~所以实是不安全个
memcpy Version 1:
[cpp] view plaincopyprint?
1.char* cb_memcpyVer1(char* dst, const char* src, size_t size) {
2.
3. assert((dst!=NULL) && (src!=NULL));
4.
5. char* retAddr = dst;
6. while (size-- > 0) {
7. *(dst++) = *(src++);
8. }
9. return retAddr;
10.}
CB: memcpy 和 strncpy 最大的实是 区memcpy不遇到 会'\0' 实束拷实 .memcpy Version 2 :
[cpp] view plaincopyprint?
1.char* cb_memcpyVer2(char* dst, const char* src, size_t size) {
2.
3. assert((dst!=NULL) && (src!=NULL));
4.
5. char* retAddr = dst;
6. size_t i = 0;
7. /* --- 解据重实实决数区叠 --- */
8. if ((retAddr>src) && (retAddr<(src+size))) {
9. for (i=size-1; i>=0; i--) { 10. *(dst++) = *(src++); 11. }
12. }
13. else
14. {
15. for (i=0; i 0); 18. }
19.
20. return dest;
21.}
memset:
[cpp] view plaincopyprint?
1.void* cb_memset(void* buffer, int b, size_t size) { 2.
3. assert(buffer!=NULL); 4. char* retAddr = (char*)buffer;
5. while (size-- > 0) { 6. *(retAddr++) = (char)b;
7. }
8. return retAddr;
9.}
Memset使用实实区:
[cpp] view plaincopyprint?
1.char a[10];
2.memset(a, 0, sizeof(char)*10); //实操作完全必要个没 因实下面实实存实上要被使用内了。
3.memcpy(a, "Hello", 5);
strlen:
[cpp] view plaincopyprint?
1.int cb_strlen(const char* str) {
2.
3. assert(str!=NULL);
4.
5. int len = 0;
6. while (*str!='\0') { /**< '\0', stop */
7. str++;
8. len++ ;
9. }
10.
11. return len;
12.}
Recursive strlen:
[cpp] view plaincopyprint?
1.int cb_strlen(const char *str)
2.{
3. if ((str == NULL) || (*str == '\0')) {
4. return 0;
5. }
6. else
7. {
8. return cb_strlen(str+1)+1; /**< Rescursive */
9. }
10.}
strcat:
[cpp] view plaincopyprint?
1.char* cb_strcat(char* dst, char* src) {
2.
3. assert(src!=NULL);
4.
5. char* retAddr = dst; 6. /* --- Find last position --- */
7. while (*dst++ != '\0') { 8. ;
9. }
10. dst--;
11. while (*dst++ = *src++) { 12. ;
13. }
14. return retAddr;
15.}
strcmp:
[cpp] view plaincopyprint?
1.int cb_strcmp(char* str, char* str2) { 2.
3. assert((str!=NULL) && (str2!=NULL));
4.
5. char* pStr = str;
6. char* pStr2 = str2;
7. while (*pStr && *pStr2 && (*pStr==*pStr2)) {
8. pStr++;
9. pStr2++;
10. }
11. return (*pStr - *pStr2); /**< 相等实实0 , 前者大于后者大于0, 反之小于0 */
12.}
strchr:
[cpp] view plaincopyprint?
1.char* cb_strchr(char* str, char c){
2.
3. assert(str!=NULL);
4. char* retAddr = str;
5.
6. while (*retAddr!=c) {
7. retAddr++;
8. }
9. if (*retAddr == c) {
10. return retAddr;
11. }
12. else
13. {
14. return NULL;
15. }
16.}
实些字符串操作函实实实要注意实些实实 ,数
1. 需要实实指实的有效性~一般通实直接和NULL实行比实判。来断
2. 函需要能实实行实式操作~也就是实 数char* a = strcpy(b, "Hello");
3. src的实需要加 const
4. strcnpy 和 memcpy 有 '\0' 判的实断区
5. 内区叠存重实实 ,
比如实程序,个
[cpp] view plaincopyprint?
1.int main(void) {
2. char buffer[]="abcdefg";
3. memcpy(buffer, buffer+2 ,3); //buffer+2(从c实始 实度3个 cde)
4. printf("%s", buffer);
5.}
实实果实个: cdedefg .
再看下面实程序,个
[cpp] view plaincopyprint?
1.int main(void) {
2. char buffer[]="abcdefg";
3. memcpy(buffer+2, buffer ,3); //如果幸的实你运 出实会 abcab[d]fg 中括是号
随机实
4. printf("%s", buffer);
5.}
实里的memcpy就需要用 memmove的实实方式代替 。来
本文档为【C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。