对字符串操作的简单功能(一)

简述:
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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值