c/c++基础(一) 字符串系列-外加mem处理

1Strlen() 字符串长度

/*author:   emil jonson

* function: 实现strlen(),计算字符串长度,不包括'/0'

* edition:  1.0.0

*/

#include<iostream>

#include<string>

#include<assert.h>

using namespace std;

 

unsigned int myStrlen(const char *str)

{

         assert(str!=NULL);

         unsigned int count=0;          //字符长度

         while(*str++!='/0')

            count++;

         return count;

}

 

int main()

{

    char *str=new char[100];

    cin>>str;

    cout<<myStrlen(str)<<endl;

    cout<<strlen(str)<<endl;             //库函数中的标准strlen()

    system("pause");

}

2Strcpy() 复制字符串

/*author:   emil jonson

* function: 实现strcpy(),字符串复制

* edition:  1.0.0

*/

#include<assert.h>

#include<iostream>

using namespace std;

 

char *strcpy( char *dest, const char *src)

{

       assert((dest != NULL) && (src != NULL));

       int len = 0;

      

       const char *temp = src;     //用来计算源字符串长度的指针

      

       while(*temp++ != '/0')    //计算源字符串长度

           len++;

      

       delete dest;                  //释放目的指针原内存,并分配空间(注:标准strcpy()

                      库函数未考虑这种情况,当目的空间不够时将出错!)

       dest = new char[len+1];

       char *re = dest;          //返回用的指针,需此时才能赋值,否则若在释放dest//前将没有释放re,仍然返回原字符串

       while((*dest++ = *src++) != '/0')  //未处理内存重叠情况

           NULL ;

       return re;

}

 

int main()

{

    char *dest = "h";

    char *src = "sello";

   

    cout<<strcpy(dest, src)<<'/n';

   

    system("pause");

}

 

附:

char * __cdecl strncpy (

        char * dest,

        const char * source,

        size_t count

        )

{

        char *start = dest;

 

        while (count && (*dest++ = *source++))    /* copy string */

                count--;
 

        if (count)                              /* pad out with zeroes */

                while (--count)
                        *dest++ = '/0';
 

        return(start);

}
这是strncpy的具体实现,如果nCount等于或小于dest的内存大小,是不会补’/0’的。

3Strcat() 连接字符串

/*author:   emil jonson

* function: 实现strcat(),字符串连接

* edition:  1.0.0

*/

#include<stdio.h>

#include<string>

#include<assert.h>

#include<iostream>

using namespace std;

 

void myStrcat(char *str1, char *str2)

{

     assert(( str1 != NULL )&&( str2 != NULL)); //输入验证

    

     char *temp = new char[strlen(str1+1)];     //中间字符串用来保存str1中原字符串

     int i = 0, j = 0;

     while((temp[i++] = str1[j++]) != '/0')

                    ;

    

     delete str1;                                   //str1重新分配内存

     str1 = new char[strlen(str1)+strlen(str2)+1];

    

     for(int k = 0; k <= i; k++)                  //将原字符串存入str1

             *str1++ = temp[k++];

    

     delete temp;                                 //释放temp,并防止野指针

     temp = NULL;

    

     while((*str1++ = *str2++) != '/0')            //str1后追加str2

                   ;

     *str1++ = '/0';                               //加结束符

}

 

int main()

{

    char s1[40],s2[40];

    printf("输入两个字符串:/n");

    gets(s1);

    gets(s2);

   

    strcat(s1, s2);

   

    printf("连接以后的字符串为:");

    puts(s1);

   

    system("pause");

}

4Strcmp() 字符串比较

/*author:   emil jonson

* function: 实现strcmp(),字符串比较 相等返回0,大于返回1,小于返回-1

* edition:  1.0.0

*/

#include<stdio.h>

#include<assert.h>

#include<iostream>

using namespace std;

 

int strcmp(const char *str1, const char *str2)

{

    assert((str1 != NULL)&&(str2 != NULL));                         //输入检验

   

    while((*str1 == *str2) && (*str1 != '/0') && (*str2 != '/0'))   //若字符相等,继续比较下一

    {                                                                                     //个字符

                 str1++;

                 str2++;

    }

   

    if(*str1 > *str2) return 1;         //确定返回值

    if(*str1 == *str2) return 0;

    if(*str1 < *str2) return -1;

}

 

int main()

{

    char *s1 = new char[10];

    char *s2 = new char[10];

//  scanf("%s", s1);

//  scanf("%s", s2);

//  gets(s1);

//  gets(s2);

    cin>>s1>>s2;

    cout<<strcmp(s1, s2)<<'/n';

   

    system("pause");

}

5.逆序字符串

/*author:   emil jonson

* function: 实现字符串逆序

* edition:  1.0.0

*/

#include<string>

#include<assert.h>

#include<iostream>

using namespace std;

// 1   无返回值,直接输出逆序后字符串

void rev(const char *s)

{

     assert(s != NULL);

     int i = strlen(s)-1;

     for(;i >= 0;i--)

       cout<<s[i];

     cout<<endl;

}

//2   返回新字符串 —指向对内存的指针

char *rev1(const char *s)

{

     assert(s != NULL);

     int len = strlen(s);

     char *temp = new char[len+1];     //给新字符串分配内存

     int i;

     for(i = 0; len > 0; i++, len--)   //给新字符串赋值

       temp[i] = s[len-1];

     temp[i+1] = '/0';                 //新字符串加结束符'/0'

     return temp;

}

//3   递归实现,无返回值

void digui_rev(const char *s)

{

     assert(s != NULL);

     if(*s == '/0')    //退出条件,进行到字符串结束处

       return;

     else

     {

         digui_rev(s+1);

         cout<<*s;

     }

}

int main()

{

    char *s = "hello";

    rev(s);         // 1   不返回

    char *s1 = rev1(s);

    cout<<s1<<endl;  //2   返回字符串

    digui_rev(s);    //3   递归

    cout<<endl;

    int len = strlen(s);//4 不调用函数

    for( ;len > 0; len--)

       cout<<s[len-1];

      

    system("pause");

}

6.回文字符串

...

7.memcpy() and memset()

...

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值