strcpy strlen memcpy strcat strcmp strstr strrev函数的实现代码

/* 
//strcpy函数的实现,注意命名要与原来的库函数有区别 
#include <iostream>
#include <cstdio>
#include <assert.h>
using namespace std;

char *mystrcpy(char *strDest, const char *strSrc)
{
     if ((strDest == NULL) || (strSrc == NULL))//保证strDest和strSrc的有效性 
         return NULL;
     char *strDestCopy = strDest;//保存目标字符串的首地址,以便最后的返回 
     //注意:++的优先级要比*的要高 
     while ((*strDest++ = *strSrc++) != '\0');//将字符从strsrc中复制到strDest中 
     return strDestCopy; 
}

int main()
{
    char *strSrc = "Hello World!";
    char strDest[20];
    mystrcpy(strDest, strSrc);
    printf("strDest:%s\n", strDest); 
    
    system("pause");
}
*/

/* 
//strlen函数的实现,有两种方法实现
#include <iostream>
#include <cstdio>
#include <assert.h>
using namespace std;

//第一种方法就是通过一个变量len的自增,直至遇到字符串的结束字符 
int mystrlen1(const char *strSrc)
{
    assert(strSrc != NULL);//保证字符串首地址的有效性 
    int len = 0;//结果的保存 
    while (*strSrc++ != '\0'){
          len++; 
    } 
    return len; 
} 

//第二种方法就是通过对字符串首地址的保存,再用字符串的末地址减去首地址就可以
int mystrlen2(char *strSrc)
{
    int len; 
    char *tmpstrSrc = strSrc;//将字符串的首地址先保存下来 
    while (*strSrc++ != '\0'); //直至遇到字符串的结束符,strSrc已经为字符串的末地址 
    len = (strSrc - tmpstrSrc - 1);//末地址减去首地址,得出结果 
    return len; 
} 

int main()
{
    char *strSrc = "Hello World!";
    int len1, len2;
    len1 = mystrlen1(strSrc);
    len2 = mystrlen2(strSrc); 
    printf("len1 = %d\n", len1);
    printf("len2 = %d\n", len2); 
    
    system("pause"); 
} 
*/

/* 
//memcpy函数的实现 
#include <iostream>
#include <cstdio>
#include <assert.h>
using namespace std;

void *mymemcpy(void *memTo, const void *memFrom, int size)
{
    assert((memTo != NULL) && (memFrom != NULL));//保证字符串的有效性
    char *tmpmemTo = (char *)memTo;//对字符串首地址的保存 
    char *tmpmemFrom = (char *)memFrom; 
    //按照size的大小进行复制 
    while (size-- > 0){
          *tmpmemTo++ = *tmpmemFrom++; 
    } 
    return memTo; 
} 

int main()
{
    char *strFrom = "Hello World!";
    char strTo[20];
    mymemcpy(strTo, strFrom, 6);
    strTo[6] = '\0';
    printf("strTo:%s\n", strTo); 
    
    system("pause"); 
} 
*/

/* 
//strcat函数的实现
#include <iostream>
#include <cstdio>
#include <assert.h>
using namespace std;

char *mystrcat(char *strDest, char *strSrc)
{
     char *tmpstrDest;
     tmpstrDest = strDest;//保存目标字符串的首地址 
     while (*strDest++ != '\0');// 循环到字符串的末尾 
     strDest--; 
     while ((*strDest++ = *strSrc++) != '\0');//进行字符串的复制 
     return tmpstrDest; //字符串首地址的返回 
} 


int main()
{
    char *strDest = NULL; 
    char *strSrc1 = "Hello ";
    char *strSrc2 = "World!";
    strDest = (char *)malloc(256);
    *strDest = '\0';
    mystrcat(mystrcat(strDest, strSrc1), strSrc2);
    printf("strDest:%s\n", strDest);
    free(strDest);
    strDest = NULL; 
    
    system("pause"); 
} 
*/

/* 
//strcmp函数的实现
#include <iostream>
#include <cstdio>
using namespace std;

int mystrcmp(const char *strSrc, const char *strDest)
{
    int ans = 0;//结果的保存 
    //取两个字符串的各个字符进行相减,即是它们的ASCII相减 
    while (!(ans = *(unsigned char *)strSrc - *(unsigned char *)strDest) && *strDest){
          ++strSrc;
          ++strDest; 
    } 
    if (ans > 0)
        ans = 1;
    else if (ans < 0)
        ans = -1;
    return ans; 
} 


int main()
{
    char *str = "1234567";
    char *str1 = "1234567";
    char *str2 = "12345678";
    char *str3 = "1234566";
    
    int test1 = mystrcmp(str, str1);
    int test2 = mystrcmp(str, str2);
    int test3 = mystrcmp(str, str3);
    
    cout << test1 << endl << test2 << endl << test3 << endl; 
    
    system("pause"); 
} 
*/

/* 
//strstr函数的实现
#include <iostream>
#include <cstdio>
using namespace std;

int mystrstr(const char *strSrc, const char *strSub)
{
    int pos = 0;
    //对两个字符串的首地址进行保存 
    const char *bp; 
    const char *sp;
    if (strSrc == NULL || strSub == NULL)//保证字符串的有效性 
        return -1;
    while (strSrc){
          bp = strSrc;//得到其字符串的首地址,从首地址开始进行逐一比较字符串是否相等! 
          sp = strSub;
          do{ 
             if (!*sp)//如果子串到达了字符串的结束符,证明已经找到,返回其位置 
                return pos; 
          } while (*bp++ == *sp++);
          pos++;
          strSrc++;//如果没有找到,将主模式串的位置向前推进一位,继续比较,一直到达字符串的结尾! 
    } 
    return -1; 
} 

int main()
{
    char *strSrc = "123456";
    char *strSub = "345";
    int pos = mystrstr(strSrc, strSub);
    cout << pos << endl; 
    
    system("pause"); 
} 
*/


//strrev函数的实现 
#include <iostream>
#include <cstdio>
using namespace std;


//方法1:遍历字符串,将第一个字符和最后一个字符交换,第2个和倒数第2个字符交换,依次循环! 
char *strrev1(const char* str)
{
     int len = strlen(str);
     char *tmp = new char[len+1];
     strcpy(tmp, str);
     for (int i = 0; i < len/2; i++){
         char c = tmp[i];
         tmp[i] = tmp[len-1-i];
         tmp[len-1-i] = c; 
     } 
     
     return tmp; 
} 

//方法2:用指针进行直接的操作
char *strrev2(const char *str)
{
     int len = strlen(str);
     char *tmp = new char[len+1];
     strcpy(tmp, str);
     char *ret = tmp;//保存首地址 
     char *p = tmp + len - 1; //保存尾地址
     
     while (p > tmp){
           char t = *tmp;
           *tmp = *p;
           *p = t;
           --p;
           ++tmp; 
     } 
     
     return ret; 
} 

//方法3:我们借助异或运算(^)完成两个字符的交换
char *strrev3(const char *str)
{
     char *tmp = new char[strlen(str) + 1];
     strcpy(tmp, str);
     char *ret = tmp;
     char *p = tmp + strlen(str)-1;
     
     while (p > tmp){
           *p ^= *tmp;
           *tmp ^= *p;
           *p ^= *tmp;
           --p;
           ++tmp; 
     } 
     
     return ret; 
} 

char *strrev4(const char *str)
{
     char *tmp = new char[strlen(str) + 1];
     strcpy(tmp, str);
     char *ret = tmp;
     char *p = tmp + strlen(str)-1;
     
     while (p > tmp){
           *p = *p + *tmp;
           *tmp = *p - *tmp;
           *p = *p - *tmp;
           --p;
           ++tmp; 
     } 
     
     return ret; 
} 


int main()
{
    char *str = "123456";
    cout << str << endl;
    
    char *str2 = strrev1(str);
    cout << str2 << endl;
    
    char *str3 = strrev2(str);
    cout << str3 << endl;
    
    char *str4 = strrev3(str);
    cout << str4 << endl;
    
    char *str5 = strrev4(str);
    cout << str5 << endl;
    
    system("pause"); 
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值