字符串的各种操作

// StrOperate.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"

/*本源文件总结了一些操作字符串的相关函数,
所用开发工具:vs2010,空的控制台应用程序。
			----西德德2013-10*/


/*以下是根据具体需求自己加上的头文件*/
#include <iostream>
#include <string> 
#include <cassert>   //断言 assert 所用到的头文件

using namespace std;

/*求字符串s的倒序*/
char* reverse (char* s)
{
	char tempchar;
	int nLen = strlen(s);
	
	//之所以是nLen/2(取整),因为倒序一个字符串相当于以中间为界,两边对应的字符串交换位置。
	for(int i = 0; i<nLen/2; i++)
	{				
		tempchar = *(s+nLen-1-i) ;
		*(s+nLen-i-1) = *(s+i);
		*(s+i) = tempchar;
	}
	return s;
}

/*写个函数 将字符串按单词反转 如 i love sunny 转成 sunny love i*/
char* WordReverse(char* s)
{
	int len = strlen(s);
	char tmp[24];
	int i , j , start = 0;
	s = reverse(s);

	for( i = 0; i<len; i++)
	{	
		if(*(s+i)!=' ')
			tmp[i - start] = *(s+i);

		else 
		{
			tmp[i - start] = '\0';
			reverse(tmp);
			cout<<"tmp:"<<tmp<<endl;
			for( j = start; j<i; j++ )
				*(s + j) = tmp[j - start];

			start = i + 1;
		}
	}
	tmp[i - start] = '\0';
	reverse(tmp);
	cout<<"tmp:"<<tmp<<endl;
	for( j = start; j<i; j++ )
		*(s + j) = tmp[j - start];

	return s;	
}

/*完美版strlen*/
int kone_strlen( const char *str ) 
{  
	assert(str != NULL);
	int len = 0;
	while((*str++)!='\0')
	{
		len++;
	}
	return len;
}

/*串拷贝函数*/
char* kone_strcpy(char* strDest , char* strSrc)
{
	if ( (strDest==NULL)||(strSrc==NULL) )    //[1]检查指针有效性
		throw "Invalid argument(s)";          //[2]抛出异常
	//assert((strDest!=NULL) && (strSrc !=NULL)); //本句可完美代替 [1][2]

	char * strDestCopy = strDest;             //[3]保存原始的strDest值
	
	while ((*strDest++=*strSrc++)!='\0');     //[4]

	return strDestCopy;     //返回char * :实现链式表达式
}

/*去掉串中的所有空格*/
char* AllTrim(char* str)
{
	char* p = str;
	char *pflag = NULL;
	while(*p!='\0')
	{
		if (*p == ' ')  
		{
			pflag = p;
			while( *pflag!='\0' )
			{
				*pflag = *(pflag+1);      
				pflag++;
			}
		}
		else		p++;	
	}
	return str;
}

/*字符串循环右移n个字符*/
void LoopMove( char *pStr, int steps )
{
	/*方法一:*/
	int n = strlen( pStr ) - steps;
	char tmp[255]; 
	strcpy ( tmp, pStr + n ); 
	strcpy ( tmp + steps, pStr); 
	*( tmp + strlen ( pStr ) ) = '\0';
	strcpy( pStr, tmp );
	
	/*方法二:
	int n = strlen( pStr ) - steps;
	char tmp[254]; 
	memcpy( tmp, pStr + n, steps ); 
	memcpy(pStr + steps, pStr, n ); 
	memcpy(pStr, tmp, steps ); */
}


/*主函数*/
int _tmain(int argc, _TCHAR* argv[])
{

	/*串的倒序测试、strlen测试:
	char c[24];
	cout<<"please input the string:"<<endl;
	cin>>c;
	cout<<"input string length : "<<kone_strlen(c)<<endl;  
	cout<<"before:"<<c<<endl;
	cout<<" after:"<<reverse(c)<<endl;
	*/

	/*按单词倒序串测试:*/
	char cs[] = {"  12 34 567 8 "};
	cout<<"<"<<WordReverse(cs)<<">"<<endl;

	/*串拷贝测试、去掉串中的所有空格测试:
	char src[] = {" 123 45 "};
	char dest[] = {" he llo "};	
	cout<<kone_strcpy(dest,src)<<endl;  
	cout<<"去掉串中空格之后kk"<<AllTrim(src)<<"oo"<<endl;
	*/

	/*循环右移测试:
	char strMove[] = {"12345678"};
	LoopMove(strMove , 3);
	cout<<"右移n位"<<strMove<<endl;
	*/

	return 0;
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值