zoukankan      html  css  js  c++  java
  • strcpy、strncpy、strlen、memcpy、memset、strcat、strncat、strcmp、strncmp,strchr

    1、strcpy

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 char *mystrcpy(char *dest, const char *src)
     5 {
     6     assert((dest != NULL) && (src != NULL));
     7 
     8     char *res = dest;
     9     while ((*dest++ = *src++) != '');
    10 
    11     return res;
    12 }
    13 
    14 int main()
    15 {
    16     char *src = "0123456789";
    17     char dest[11];
    18     printf("%s
    ", src);
    19     char *res = mystrcpy(dest, src);
    20     printf("%s
    ", res);
    21 
    22     return 0;
    23 }

    2、strncpy

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 char* mystrncpy(char *dest, const char *src, size_t size)
     5 {
     6     assert((dest != NULL) && (src != NULL));
     7 
     8     char *res = dest;
     9     int i = 0;
    10     while (((*dest++ = *src++) != '') && (i++<size));
    11 
    12     *(res + size) = '';
    13 
    14     return res;
    15 }
    16 
    17 int main()
    18 {
    19     char *src = "0123456789";
    20     printf("%s
    ", src);
    21     char dest[5];
    22     char *res = mystrncpy(dest, src, 4);
    23     printf("%s
    ", res);
    24 
    25     return 0;
    26 }

    3、strlen

    (1)非递归实现

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 int mystrlen(const char *str)
     5 {
     6     assert(str != NULL);
     7 
     8     int len = 0;
     9     while ((*str++) != '')
    10         ++len;
    11 
    12     return len;
    13 }
    14 
    15 int main()
    16 {
    17     char *str = "0123456789";
    18     int len = mystrlen(str);
    19     printf("%d
    ", len);
    20 
    21     return 0;
    22 }

    (2)递归实现

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 int strlenRecur(const char *str)
     5 {
     6     if (str == NULL || *str == '')
     7         return 0;
     8     return strlenRecur(str + 1) + 1;
     9 }
    10 
    11 int main()
    12 {
    13     char *str = "0123456789";
    14     int len = strlenRecur(str);
    15     printf("%d
    ", len);
    16 
    17     return 0;
    18 }

    4、memcpy

     memcpy 和 strncpy 最大的区别是 memcpy不会遇到 '' 结束拷贝 。

    (1)version1(不能解决数据区重叠问题):

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 char* mymemcpy1(char *dest, const char *src, size_t size)
     5 {
     6     assert((dest != NULL) && (src != NULL));
     7 
     8     char *res = dest;
     9     while (size)
    10     {
    11         *(dest++) = *(src++);
    12         --size;
    13     }
    14     *(dest + size) = '';
    15 
    16     return res;
    17 }
    18 
    19 int main()
    20 {
    21     char *src = "0123456789";
    22     char dest[5];
    23     char *res = mymemcpy1(dest, src,4);
    24     printf("%s
    ", res);
    25 
    26     return 0;
    27 }

    (2)version2(解决了数据区重叠问题):

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 char *mymemcpy2(char *dest, const char *src, size_t size)
     5 {
     6     assert((dest != NULL) && (src != NULL));
     7     char *res = dest;
     8 
     9     if (dest > src&&dest < (src + size))
    10     {
    11         dest = dest + size - 1;
    12         src = src + size - 1;
    13         while (size--)
    14             *dest-- = *src--;
    15     }
    16     else
    17         while (size--)
    18             *dest++ = *src++;
    19     *(dest + size) = '';
    20 
    21     return res;
    22 }
    23 
    24 int main()
    25 {
    26     char *src = "0123456789";
    27     char dest[5];
    28     char *res = mymemcpy2(dest, src,5);
    29     printf("%s
    ", res);
    30 
    31     return 0;
    32 }

     5、memset

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 void *mymemset(void *buf, const char c, size_t size)
     5 {
     6     assert(buf != NULL);
     7     char *res = (char*)buf;
     8     char *str = res;
     9     while (size--)
    10         *str++ = c;
    11 
    12     return res;
    13 }
    14 
    15 int main()
    16 {
    17     char *src = "0123456789";
    18     printf("%s
    ", src);
    19     char dest[5];
    20     void *buf = (char*)dest;
    21     char *res = (char *)(mymemset(buf, 'a', 5));
    22     printf("%s
    ", res);
    23 
    24     return 0;
    25 }

    6、strcat

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 char *mystrcat(char *dest, const char *src)
     5 {
     6     assert((dest != NULL) && (src != NULL));
     7     char *res=dest;
     8     while (*dest != '')
     9         ++dest;
    10     while (*src != '')
    11         *dest++ = *src++;
    12 
    13     return res;
    14 }
    15 
    16 int main()
    17 {
    18     char dest[15] = "123";
    19     char *src = "abc";
    20     char *res = mystrcat(dest, src);
    21     printf("%s
    ", res);
    22 
    23     return 0;
    24 }

    7、strncat

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 char *mystrncat(char *dest, const char *src,size_t size)
     5 {
     6     assert((dest != NULL) && (src != NULL));
     7     char *res=dest;
     8     while (*dest != '')
     9         ++dest;
    10     while ((*src != '')&&(size--))
    11         *dest++ = *src++;
    12     *dest = '';
    13 
    14     return res;
    15 }
    16 
    17 int main()
    18 {
    19     char dest[15] = "123";
    20     char *src = "abcdef";
    21     char *res = mystrncat(dest, src,3);
    22     printf("%s
    ", res);
    23 
    24     return 0;
    25 }

    8、strcmp

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 int mystrcmp(const char *str1, const char *str2)
     5 {
     6     assert((str1 != NULL) && (str2 != NULL));
     7     while (*str1&&*str2 && (*str1++ == *str2++));
     8 
     9     return (*str1 - *str2);
    10 }
    11 
    12 int main()
    13 {
    14     char *str1 = "abcde";
    15     char *str2 = "abdf";
    16     int res = mystrcmp(str1, str2);
    17     printf("%d
    ", res);
    18 
    19     return 0;
    20 }

    9、strncmp

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 int mystrncmp(const char *str1, const char *str2,size_t size)
     5 {
     6     assert((str1 != NULL) && (str2 != NULL));
     7     while (*str1&&*str2 && (*str1++ == *str2++)&&size--);
     8 
     9     return (*str1 - *str2);
    10 }
    11 
    12 int main()
    13 {
    14     char *str1 = "abcde";
    15     char *str2 = "abdfsd";
    16     int res = mystrncmp(str1, str2,4);
    17     printf("%d
    ", res);
    18 
    19     return 0;
    20 }

    10、strchr

     1 #include<stdio.h>
     2 #include<assert.h>
     3 
     4 char *mystrchr(const char *str, char c)
     5 {
     6     assert(str != NULL);
     7     while (*str != '' && (*str != c))
     8         ++str;
     9 
    10     if (*str == c)
    11         return (char*)str;
    12     else
    13         return NULL;
    14 }
    15 
    16 int main()
    17 {
    18     char *str = "abcde";
    19     char *res = mystrchr(str,'c');
    20     printf("%s
    ", res);
    21 
    22     return 0;
    23 }
  • 相关阅读:
    泛型的模板思想
    GTD:是一种态度
    如何debug android cts
    POJ 3352 无向图边双连通分量,缩点,无重边
    Oracle—用户管理的备份(一)
    Retinex processing for automatic image enhancement 翻译
    myBatis抛出异常Result Maps collection already contains value ...
    xxx cannot be resolved to a type 错误解决方法
    Cannot change version of project facet Dynamic Web Module to 3.0
    mysql JDBC URL格式各个参数详解
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8569758.html
Copyright © 2011-2022 走看看