1 实现字符串的翻转: 如-- Thank you for all your time→ Thank you for all your time

2 完成字符串的替换:如:Thank you for all your time 把空格键 替换成 %20.


1 实现字符串的翻转: 如-- Thank you for all your time→ Thank you for all your time

思路:

1 整体翻转字符串

2 翻转每一个单词(使用 ' '或者是其他的 标点符号 进行分割)


void ReverserTheword( char  *strIn, int lenWorld )
{
    assert(strIn!=NULL);
    char tmp;
    for(int i=0;i<lenWorld/2;i++)
    {
        tmp=strIn[i];
        strIn[i]=strIn[lenWorld-1-i];
        strIn[lenWorld-1-i]=tmp;
    }
    cout<<"翻转后的字符串是:"<<strIn<<endl;
}
//nihao ok dajia. →aijad ko oahin →dajia ok nihao
int ReverseTheWords( char *strIn )
{
    assert(strIn!=NULL);
    char *head=strIn;
    int lenWord;
    char* everyWord;
    cout<<head<<endl;
                                                                                
    ReverserTheword(head,strlen(head));
    while(*strIn!='\0')
    {
        //两种情况退出循环:1 遇到字符串结束(一个单词)   2 遇到空格键 或者其他的比如 ,.之类的可以改写(一个单词)
        /*cout<<strIn<<endl;*/
        everyWord=strIn;
        lenWord=0;             //记录每一个单词的起始位置以及长度。
        while(*strIn!='\0')
        {
            if(*strIn==' ')   
            {
                strIn++;
                break;
            }
            else
            {
                strIn++;
                lenWord++;
            }  
        }
        ReverserTheword(everyWord,lenWord);
    }
    //ReverserTheword(head,strlen(head));   //这一步放在前面和后面都是一样的啊,哈哈。
    cout<<"最后的结果是:"<<head<<endl;
    return 1;
}


测试代码

////char *str="the important things.";    //这样写会发生错误的,常量字符串不能够改变其中的内容。
char str[]="Thank you for all your time.";
ReverseTheWords(str);

2 完成字符串的替换:如:Thank you for all your time 把空格键 替换成 %20.

思路:找到 src(要改变的字符串)的首字符进行 字符串的匹配,匹配后 进行替换。

注意:标记 tmp,str的起始位置,无论是 strcpy还是 cout<<strAddress;,还有就是匹配和复制字符串(src和dst)的起始位置需要标记。否则 指针变化后无法得到正确的结构。


bool isSubString( char * str, const char * src )
{
    assert(str!=NULL&&src!=NULL);
    while(*src!='\0')
    {
        if(*str!=*src)
        {
            return false;
            /*break;*/
        }
        str++;
        src++;
    }
    return true;
}
void replaceString( char *str, const char *src, const char *dst )
{
    assert(str!=NULL&&src!=NULL&&dst!=NULL);
    cout<<str<<endl;
    int lenstrlen(src);
     char *tmp=new char[100];
    memset(tmp,'1',100);
    char *addressTemp=tmp,*addressStr=str,*tmpDest;
    while(*str!='\0')
    {
        //每一个单词 用 src来分割
        if(*str==*src&&isSubString(str,src))
        {
            str+=lenSrc;
            //复制 dest字符串
            tmpDest=(char*)dst;
            while(*tmpDest!='\0')
            {
                *tmp++=*tmpDest++;
            }
        }
        else
        {
            *tmp++=*str++;
        }
    }
    *tmp='\0';
    cout<<addressTemp<<endl;
    //strcpy(str,tmp);            //错误,因为指针已经发生了变化,必须要记住 初始化的位置的指针。
    strcpy(addressStr,addressTemp);
    delete[] addressTemp;        //delete[] tmp; 错误的
}


测试代码:

//char *str="Thank you for all the time."; 
//错误:因为 指针指向的是 静态存储的常量区,不能改变str的值。
    char str[100]="Thank you for all the time.";
    replaceString(str," ","%20");