简述:
1、不使用库函数将字符串转换为数字
2、编程实现strcpy()函数
3、编程实现字符串中字串的查找
4、编程实现字符串中个单词的翻转
5、编程查找两个字符串的最大公共子串
以下代码参考了《C和C++程序员面试秘籍》一书,代码侧注释了自己对代码的理解,如有错误之处,敬请指出。
1、不使用库函数将字符串转换为数字
/*************************************************************************
> File Name: 4.cpp
> Author: ls
> Mail: 1096475833@qq.com
> Created Time: 2019年07月08日 星期一 11时24分03秒
************************************************************************/
#include<iostream>
using namespace std;
int str2int(const char*str)
{
int temp = 0;
const char *ptr = str; //ptr保存str字符串的开头
if(*str == '-' || *str == '+') //如果第一个表示正负号,则将字符串移到下一位
{
str++;
}
while(*str != 0)
{
if((*str<'0') || (*str>'9')) //如果当前字符不为数字,则退出循环
{
break;
}
temp = temp*10+(*str-'0'); //计算数值
str++; //移到下一个字符
}
if(*ptr == '-') //判断符号位
{
temp=-temp;
}
return temp; //返回数值结果
}
int main()
{
int n = 0;
char p[10] = " ";
cin.getline(p,20);
n = str2int(p);
cout<<n<<endl;
return 0;
}
2、编程实现strcpy函数
/*************************************************************************
> File Name: 5.cpp
> Author: ls
> Mail: 1096475833@qq.com
> Created Time: 2019年07月08日 星期一 12时12分02秒
************************************************************************/
#include<iostream>
#include<stdio.h>
using namespace std;
char*m_strcpy(char *strdest,const char*strsrc)
{
if((strdest == NULL) || (strsrc == NULL))
{
return NULL;
}
char *strdestcopy = strdest;
while((*strdest++ = *strsrc++) != '\0');
return strdestcopy;
}
int GetStrLen(const char *strsrc)
{
int len = 0;
while(*strsrc++ != '\0')
{
len++;
}
return len;
}
int main()
{
char strsrc[] = "hello world!";
char strdest[20];
int len = 0;
len = GetStrLen(m_strcpy(strdest,strsrc));
printf("%s\n",strdest);
printf("%d\n",len);
return 0;
}
3、编程实现字符串中字串的查找
/*************************************************************************
> File Name: 6_strstr.c
> Author: ls
> Mail: 1096475833@qq.com
> Created Time: 2019年07月08日 星期一 13时38分49秒
************************************************************************/
#include<stdio.h>
#include<assert.h>
const char *m_strstr(const char*src,const char *sub)
{
const char*bp;
const char*sp;
if(src == NULL || sub == NULL) //判断参数的有效性
{
return src;
}
while(*src)
{
bp = src; //指向源字符串
sp = sub; //指向子字符串
do
{
if(!*sp) //如果子字符串移到结尾,表示可以在源字符串中找到子字符串,退出循环并返回此时src的首地址
{
return src;
}
}while(*bp++ == *sp++); //从某字符开始,若相等,则一直执行循环,要么子字符串先结束,成功返回;要么源字符串先结束,失败继续重新循环,最后返回null
src += 1; //源字符串地址后移一位
}
return NULL;
}
int main()
{
char p[] = "12345";
char q[] = "56";
const char *r = m_strstr(p,q);
printf("r:%s\n",r);
return 0;
}
4、编程实现字符串中个单词的翻转
/*************************************************************************
> File Name: 7_revstr.cpp
> Author: ls
> Mail: 1096475833@qq.com
> Created Time: 2019年07月08日 星期一 13时59分23秒
************************************************************************/
#include<iostream>
using namespace std;
void m_revstr(char *src)
{
char *start = src,*end = src,*ptr = src; //开头、结尾、指针均指向源首地址
while(*ptr++ != '\0') //遍历源字符串
{
if(*ptr == ' ' || *ptr == '\0') //找到一个单词或者字符串末尾
{
end = ptr-1; //指向单词的最后一个字母
while(start < end)
{
swap(*start++,*end--); //单词反转
}
start = end = ptr+1; //完成之后,开头结尾指向下一个单词的起始位置
}
}
start = src,end = ptr-2; //start指向源字符串首地址,end指向末尾。ptr在while循环的时候已经指向\0的后一位,因此ptr-1为\0,ptr-2才指向最后一个单词
while(start<end) //反转整个字符串
{
swap(*start++,*end--);
}
}
int main()
{
char str[] = "i am from xuzhou";
cout<<str<<endl;
m_revstr(str);
cout<<str<<endl;
return 0;
}
5、编程查找两个字符串的最大公共子串
/*************************************************************************
> File Name: 8_commonstr.c
> Author: ls
> Mail: 1096475833@qq.com
> Created Time: 2019年07月08日 星期一 14时31分33秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *commonstring(char *str1,char *str2)
{
int i,j;
char *shortstr,*longstr;
char *substr;
if(NULL == str1 || NULL == str2) //判断参数的有效性
{
return NULL;
}
if(strlen(str1) <= strlen(str2)) //找到最短的字符串
{
shortstr = str1;
longstr = str2;
}
else
{
shortstr = str2;
longstr = str1;
}
if(strstr(longstr,shortstr) != NULL) //判断最短的字符串是否包含在长字符串内,若包含直接返回短字符串
{
return shortstr;
}
substr = (char*)malloc(sizeof(char)*(strlen(shortstr)+1)); //申请分配堆内存存放返回结果
for(i = strlen(shortstr)-1;i>0;--i) //开始以 总长度-1从短字符串内依次提取字符串到substr 进行与长字符串进行比较,判断是否包含在长字符串内
{ //如果不成立,则以 总长度-2从短字符串内依次提取字符串到substr,进行与长字符串进行比较,判断是否包含在常字符串内,依此类推
for(j = 0; j <= strlen(shortstr)-i;j++) //直至 没有长度,返回null
{
memcpy(substr,&shortstr[j],i);
substr[i] = '\0';
if(strstr(longstr,substr) != NULL)
{
return substr;
}
}
}
return NULL;
}
int main()
{
char *str1 = (char*)malloc(256);
char *str2 = (char*)malloc(256);
char *common = NULL;
gets(str1);
gets(str2);
common = commonstring(str2,str1);
printf("the longest common string is:%s\n",common);
return 0;
}