Offer题4 替换空格&常量字符串和字符串数组

  1. 替换空格(P44)(面试题四) 
  2. 常量字符串和字符串数组(P42)

       请高人指点:书上面试题4的代码好像在字符串末尾的'\0'上有瑕疵,我认为下面这一句右边应该+1,即char字符串末尾的‘\0’没有计入newLength,但是末尾的指针却是从‘\0’开始复制的。
int newLength = originalLength + numberOfBlank * 2;

1.替换空格(P44) (面试题4)
题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy”,则输出"We%20are%20happy."。
注意点如下:
  • 要分清楚是否允许创建新的字符串,允许的话就没难度了
  • 若是必须要在原字符串覆盖,需判断char数组是否为NULL,②char数组总长度是否足够被覆盖(要先数出字符串长度和空格数)
  • 若是必须要在原字符串覆盖,思路:设两个指针指向尾部,从后向前覆盖数组

bool ReplaceBlankSpace(char *cOrigin,int nOriSize)
{//在原字符串上做覆盖,nOriSize为数组总长度
	if(cOrigin!=NULL && nOriSize>0)
	{
		//记录字符串长度(不包括'\0')和空格数
		int nStrNum=0,nSpaceNum=0;
		while(cOrigin[nStrNum]!='\0')
		{
			if(cOrigin[nStrNum]==' ')
				++nSpaceNum;
			++nStrNum;
		}
		//原空间不足,必须算上'\0',
		if(nOriSize < (nStrNum+1+2*nSpaceNum)) 
			return false;
		int nEndPoint=nStrNum+2*nSpaceNum; //从'\0'开始
		for(int nStartPoint=nStrNum;nStartPoint>=0;--nStartPoint)
		{//从'\0'开始
			if(cOrigin[nStartPoint]==' ')
			{
				cOrigin[nEndPoint--]='0';
				cOrigin[nEndPoint--]='2';
				cOrigin[nEndPoint--]='%';
			}
			else
				cOrigin[nEndPoint--]=cOrigin[nStartPoint];
		}
		return true;
	}
	return false;
}
//创建新的字符串
bool ReplaceBlankSpace(string &stOrigin,string &stUrl)
{
	if(stOrigin.empty())
		return false;
	stUrl.clear(); //清空stUrl
	for(unsigned int i=0;i<stOrigin.size();++i)
	{
		if(stOrigin[i]==' ') //注意不要写成" "
		{
			stUrl.push_back('%');
			stUrl.push_back('2');
			stUrl.push_back('0');
		}
		else
			stUrl.push_back(stOrigin[i]);
	}
	return true;
}
int main()
{
	string stOrigin("We are happy."),stUrl;
	if(ReplaceBlankSpace(stOrigin,stUrl))
		cout<<"空格替换成功:"<<stUrl<<endl;
	else
		cout<<"替换失败……"<<endl;

	const int size=18;
	//char数组在字符串末尾会用'\0'填满
	char cOrigin[size]="We are happy.";
	if(ReplaceBlankSpace(cOrigin,size))
		cout<<"空格替换成功:"<<cOrigin<<endl;
	else
		cout<<"替换失败……"<<endl;
}
测试用例:
  • 输入字符串包含空格(一个空格位于最前、中间、最后,多个空格连续
  • 输入字符串不包含空格
  • 特殊输入测试(字符串是NULL指针、是空字符串、只有一个空格、只有连续多个空格、char数组总长度不足)
举一反三:
    有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的
2.常量字符串和字符串数组(P42)
注意点如下:
  • str1和str2是两个【字符串数组】,分配两个长度为12个字节的空间,并把"hello world"分别复制到数组中。所以两数组初始地址不同 str1≠str2
  • str3和str4是两个指针,无须分配内存以存储字符串的内容,只需要把它们指向"hello world"在内存中的地址。常量字符串在内存中【只有一个拷贝】str3==str4
int main(){
    char str1[]="hello world";
    char str2[]="hello world";
    char *str3="hello world";
    char *str4="hello world";
 if(str1 == str2)        cout<<"str1和str2相同!"<<endl;
 else        cout<<"str1和str2不同……"<<endl; 【√】
 if(str3 == str4)        cout<<"str3和str4相同!"<<endl; 【√】
 else        cout<<"str3和str4不同……"<<endl;}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值