已知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
(2)strcpy能把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]);
}