- 替换空格(P44)(面试题四)
- 常量字符串和字符串数组(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;}