面试总结字符串

 

已知strcpy的函数原型:char*strcpy(char *strDest, const char *strSrc)其中strDest是目的字符串,strSrc是源字符串。不调用C++/C的字符串库函数,请编写函数 strcpy

/*
编写strcpy函数(10分)
已知strcpy函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。
1)不调用C++/C的字符串库函数,请编写函数 strcpy
2strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了实现链式表达式。 // 2
例如 int length =strlen( strcpy( strDest, hello world) );
*/



#include <assert.h>
#include <stdio.h>
char*strcpy(char*strDest,constchar*strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL));
// 2
char* address =strDest;  // 2
while((*strDest++=*strSrc++) !='\0' )       // 2
NULL;
return address ;   // 2
}

 

 函数要求:使用标准C语言实现下列标准库函数,设计中不得使用其他库函数。
函数原型:char*strstr(char *str1,char *str2);
说明:在字符串str1中,寻找字串str2,若找到返回找到的位置,否则返回NULL

 

char*strstr(constchar*str1,const char*str2)

{

   int n = 0;

   if(*str2)   //in c the '\0' is0 in memory.

   {

       while(*str1)

       {

           for(n=0;*(str1+n)==*(str2+n);n++)

           {

               if(!*(str2+n+1))

                   return(char*)str1;

           }

           str1++;

       }

       returnNULL;

   }

   else

       return(char*)str1;

 

}

 

/*说明:在字符串str1中,寻找字串str2,若找到返回找到的位置,否则返回NULL*/

char*strstr_linux(constchar*s1, const char*s2)

{

   int l1, l2;

 

   l2 = strlen(s2);

   if (!l2)

       return(char *)s1;

 

   l1 = strlen(s1);

   while (l1>= l2)

  {

       l1--;

       if(!memcmp(s1, s2, l2))

           return(char *)s1;

       s1++;

   }

   returnNULL;

}

 

 

char*strcat(char * strDest,const char *strSrc)

{

 char*res=strDest;

 assert((strDest!=NULL)&&(strSrc!=NULL));

 while(*strDest) //while(*strDest!='/0')的简化形式,c is 0

strDest++;       

 while(*strDest=*strSrc)

 {

   strDest++;

   strSrc++;

 }

 return res;

}

 

intstrcmp (constchar*str1,const char*str2)

{     

   int len =0;

   assert((str1 != NULL) && (str2 !=NULL));

   while(*str1&& *str2 && (*str1 == *str2))

   {

      str1++;

      str2++;

   }

   return*str1-*str2;

}

 

 

 

 

#include<iostream>

#include<string>

#include<assert.h>

#include <vector>

#include <algorithm>

usingnamespace std;

 

//折半法逆置字符串

 

char*Reverse(char* s1) {

   if (s1 ==NULL)

       returns1;

 

   char* p1,*p2;

 

   p1 = s1;

   p2 = s1 + strlen(s1) - 1;

 

   char tmp;

   while (p1< p2) {

       tmp = *p1;

       *p1 = *p2;

       *p2 = tmp;

 

       p1++;

       p2--;

   }

   return s1;

}

//异或法逆置字符串

char*Reverse2(char* str) {

   if (str ==NULL)

       returnstr;

   char* f =str;

   char* b =str + strlen(str) - 1;

   while(f<b) {

       *f ^= *b;

       *b ^= *f;

       *f ^= *b;

       f++;

       b--;

   }

   return str;

}

//字符串逆置单词内部顺序不变

char*ReverseWord(char* s1)

{

   int len =strlen(s1);

   if(s1 ==NULL || len == 1)

       returns1;

 

   int i =len-1;

   int j =len;

   int t = 0;

   char*res = newchar[len +1];

   memset(res, 0, len+1);

   int k= 0;

 

   while(i>0)

   {

       while (s1[i] != ' '&& i !=0 )

           i--;

 

       t = i;

       if(i !=0)

       {

           i++;

           while(i<j)

           {

               res[k++] = s1[i++];

           }

 

           res[k++] = '';

           j = t;

           i = t-1;

       }

 

   }

   //last word

   while(i<j)

   {

       res[k++] = s1[i++];

   }

 

   res[len] = '\0';

   return res;

}

 

/*字符串和整数转换,“1234”=0x4d2; */

 

int atoi1(char s[])

{

   int i,n =0;

   int sign =1;

 

   for(i=0;isspace(s[i]);i++)//跳过空白符;

       sign=(s[i]=='-')?-1:1;

 

   if(s[i]=='+'||s[i]==' -')//跳过符号

       i++;

 

   for(n=0;isdigit(s[i]);i++)

       n=10*n+(s[i]-'0');//将数字字符转换成整形数字

 

   return sign*n;

}

voiditoa1 (int n,chars[])

{

   inti,j,sign;

 

   if((sign=n)<0)//记录符号

       n=-n;//使n成为正数

 

   i=0;

   do{

       s[i++]=n%10+'0';//取下一个数字

   }while((n/=10)>0);//删除该数字

 

   if(sign<0)

       s[i++]='-';

 

   s[i]='\0';

   for(j=i;j>=0;j--)//生成的数字是逆序的,所以要逆序输出

       printf("%c",s[j]);

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值