去掉字符串中所有空格的若干解法
题目:编写函数,去掉字符串中的所有空格。
参考解答如下:
/////////////////////////////////////////////
// 去掉字符串中的空格
// 本程序用5中方法实现
// zhao,xjtu
// 2012.4.14
//////////////////////////////////////////////////
#include<iostream>
using namespace std;
//去掉字符串中的空格1
//每从前开始,每到一个空格,就将后面的字符逐个前移一个位置。
char *alltrim(char *str)
{
    char *p=str;
    while(*p!=0)    //没有结束,循环
    {
        if(*p==' ')  //遇到空格处理
        {
            char *q=p;  //从空格处开始
            while(*q!=0) //直到末尾的所有字符
            {
                *q=*(q+1); //逐次前移
                q++;      //每移一个字符,指针加1,准备移下一个字符
            }
        } 
        else        //当前字符不是空格
        {
            p++;  //指针后移,指向待检查的新字符
        }
    }
    return str;
}
//去掉字符串中的空格2,递归
//到一个空格,将后面的字符逐个前移,去掉一个空格
//去掉一个空格的字符串,可以看做新的字符串,还是用上面的方法,递归。
char *alltrim2(char *str)
{
    char *p=str;
    while(*p!=0 && *p!=' ')  //到第1个空格或到结束
    {
        p++;
    }
    //如果到空格
    if(*p==' ')
    {
        //处理空格
        while(*p!=0)    //直到末尾的所有字符
        {
            *p=*(p+1);  //逐次前移
            p++;        //每移一个字符,指针加1,准备移下一个字符
        }
        alltrim2(str);  //将去掉完一个空格符的字符串看做新的字符串,再调用本函数,递归
    }
    return str;        //没有空格了,返回没有空格的字符串首地址
}
//去掉字符串中的空格3
//将非空格字符依次移到一个临时数组中,就是去掉空格的字符串
//然后在将临时数组中的字符串移回到原字符数组中
char *alltrim3(char *str)
{
    char *p=str;
    char *tmp;
    char *q;
    int N=0;
   
字符串转数组去除空格
    //求字符串的长度
    while(*p!=0)
    {
        N++;
        p++;
    }
   
    //申请存放字符串的临时空间
    tmp=new char[N+1];
   
    //都从头开始
    p=str;
    q=tmp;
    while(*p!=0)//直到结束
    {
        if(*p!=' ')  //是空格的话
        {
            *q=*p;  //放到临时空间中
            q++;    //临时空间指针加1
        }
        p++;        //原字符串指针加1
    }
    *q=0;          //最后放结束符
   
    //将临时空间中无空格的字符串放回原字符串中
    q=tmp;    //指针都从头开始
    p=str;
    while(*q!=0)  //直到结束
    {
        *p=*q;    //从临时空间放回原字符串中
        q++;      //两个指针都加1
        p++;
    }
    *p=0;    //最后放结束符
   
    delete []tmp;  //释放动态申请的空间
   
    return str; 
}
//去掉字符串中的空格4
//c从头开始,到一个空格,将后面的字符前移一个位子,去掉一个空格
//再从头开始,空格。
//如果从头开始没有到空格,return结束函数。
//flag=1.表示有空格
//flag=0,表示无空格
char *alltrim4(char *str)
{
   
    char *p;
    int flag=1;
    while(flag)      //
    {
        p=str;      //从头开始
        flag=0;      //假设无空格
        while(*p!=0)  //逐个检查
        {
            if(*p==' ')  //到空格
            {
                flag=1;  //表示有空格
                while(*p!=0)  //处理一个空格
                {
                    *p=*(p+1);  //后面字符前移
                    p++;
                }
            }
            else
                p++;
        }
    }
    return str;
}
//  delete blanks just among words,not at the begining or at the end.
//去掉字符串中的空格5
//只删除中间的空,不删开始和末尾的空格
//空出前面的空格,到末尾不是空格的字符指针,作为处理的界限
char *alltrim5(char *str)
{
    char *p=str;
    char *end;
   
    //开始的空格不处理
    while(*p==' ')
        p++;
   
    //find the last character that is not blank.
    //末尾不是空格的字符
    end=str;
    while(*end!='\0')
        end++;
    end--;
    while(*end==' ')
        end--;
   
    //
    while(p<end)  //不越界,逐个检查
    {
        if(*p==' ' && p<end) //到空格,且不是末尾的空格
        {
            char *q=p;
            while(*q!=0)  //处理,后面的字符前移,包括末尾的空格
            {
                *q=*(q+1);  //后面的字符前移,包括末尾的空格
                q++;
            }
            end--;          //中间删掉一个空,末尾指针也前移一个位置
        }
        else
        {
            p++;
        }
    }
    return str;
}
void main()
{
    //char s[100];
    int n=100;
    char *s;
   
    // cin>>n;
    // (c);
    s=new char[n];  //动态申请数组
    cout<<"Please input a string\n";
   
    line(s,100);
    cout<<"|"<<s<<"|\n";
    //alltrim5(s);
    //cout<<"|"<<s<<"|\n";
    cout<<"|"<< alltrim5(s)<<"|\n";  //可以调用alltrim1()...alltrim5()
   
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。