字符串的一些基本操作,复制,长度,子串查找,单词反转,比较,字符串反转,删除指定字符。




#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <assert.h>
#include <algorithm>

using namespace std;
#define maxn 10005

//实现strSrc到strDest的复制
char *strCpy(char * strDest , char * strSrc)
{
	if(strSrc==NULL||strDest==NULL)return NULL; 

	while((*strDest++ = *strSrc++)!='\0'); 
	//将strSrc字符串的内容复制到strDest中...

	return strDest ;
}

//得到str的长度
int getStrLen1(const char *str)
{
	assert(NULL != str);
	int len  = 0 ; 
	while(*str++ != '\0')
	{
		len++;
	}
	return len; 
}

int getStrlen2(const char* str)
{
	assert(NULL != str);
	const char* temp = str ;   //保存str的首地址
	while(*str++!='\0');
	return (str-temp-1) ;  //返回尾部指针与首部指针的差就是长度
}

//从字符串src里面查找sub
const char* strStr(const char* src,const char* sub)
{
	if(src==NULL||sub==NULL) return NULL;
	const char* bp;
	const char* sp;
	while(*src)   //遍历src字符串
	{
		bp = src ;
		sp = sub ;
		do 
		{                                   //遍历sub数组
			if(!*sp)                        //如果到了sub的结束位置
				return src ;                //表示找到了sub字符串,退出
		} while (*bp++ == *sp++);
		src += 1 ;
	}
	return NULL ; 
}

//编程实现字符串中各单词的翻转
void recStr(char *str)
{
	char *start = str , *end = str , *src = str ; 
	while(*src++ != '\0') ;
	end = src - 2 ;    //找到字符串的末尾 
	
	while(start < end)
	{
		swap(*start++,*end--) ; //逆置整个字符串
	}
	
	start = str , end = src-2 ;  
	src = str ; 
	while(*src++ != '\0')   //遍历一遍
	{
		if(*src==' ' || *src=='\0')   //找到一个单词
		{
			end = src-1 ;  //end指向单词末尾
			while(start < end)swap(*start++,*end--); //逆置单词

			start = end = src + 1 ;  //指向下一个单词开头
		}
	}
}

//编程实现strcmp两个字符串的比较,返回1,0或者-1
int strCmp(const char* src,const char* dst)
{
	int ans = 0 ; 
	while(!(ans = *(unsigned char *)src - *(unsigned char*)dst) && *dst)
	{   //循环比较两个字符串是否相等,不想等或者到了dst的末尾就退出
		++src;
		++dst;
	}
	if(ans>1)ans = 1 ;
	if(ans<-1)ans = -1 ;
	return ans ; 
}

//字符串反转函数,下标操作
char *strrev1(const char* str)
{
	int len = strlen(str);
	char *temp = new char[len+1] ;

	strcpy(temp,str) ;

	for(int i = 0 ; i < len/2 ; i++)
	{
		char c = temp[i] ; 
		temp[i] = temp[len-i-1] ; 
		temp[len-i-1] = c ; 

	}
	return temp ; 
}

//字符串反转函数,指针操作
char *strrev2(const char* str)
{
	int len = strlen(str) ;
	char *temp = new char[len+1] ;

	strcpy(temp,str) ;
	char *ans = temp ; 
	char *p = temp + len - 1 ;   //指向str的末尾

	while(temp<p)
	{
		char c = *temp ; 
		*temp = *p ; 
		*p = c ;
		--p ; 
		++temp ; 
	}
	return ans;
}

//实现删除字符串中所有指定的字符
char *delChar(char *str,char c)
{
	if(str==NULL)return NULL ;
	char *temp = str ; 
	char *head = str ; 

	while(*temp++)
	{
		if(*temp != c) 
		{
			*head++ = *temp ; 
		}
	}
	*head = '\0' ; 

	return head;
}


//测试用例
int main()
{
	char strSrc[maxn] ;
	char strDest[maxn] ;

	//cout<<delChar("1234554321",'1')<<endl;

	cout<<strrev1("12345")<<endl;
	cout<<strrev2("12345liuyan")<<endl;

	cout<<strCmp("12345","123456")<<endl ;
	cout<<strCmp("12345","12345")<<endl ;
	cout<<strCmp("123456","12345")<<endl ;

	int len = 0 ; 
	cout<<strStr("12345","34")<<endl;

	cin.getline(strSrc,maxn);
	recStr(strSrc) ; 
	cout<<strSrc<<endl;

	cin.getline(strSrc,maxn);
	strCpy(strDest,strSrc);
	len = getStrLen1(strDest);
	cout<<strDest<<" 的长度为: "<<len<<endl;
	return 0; 
}

//getline的用法
/************************************************************************/
/* 
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

char line[100];
cin.getline(line,100);
//注意这儿的getline是要读入空白符。但是不包括最后的换行符。
*/

/*
istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );

string line;
getline(cin,line);
//此处也是不读入换行符的。
*/
/************************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值