字符串中特定单词逆序

题目是:
读入一行文本,包含若干个单词(以空格间隔,%结尾)。将其中以 A 开头的单词与以 N 结尾的单词,用头尾交换的办法予以置换。

先看源程序:

// T.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h”
#include <string>
using std::string;
using namespace std;

void fn(string &);
void reverse(string&, string::size_type, string::size_type);

int _tmain(int argc, _TCHAR* argv[])
{
    string str;
    cout << “input a string : ” << endl;
    getline(cin, str);
    fn(str);
    cout << str;
    return 0;
}

void fn(string& str)
{
    if (str.empty())
        return;
    else
    {
        string::size_type in = str.size();
        for (string::size_type ix = 0; ix != in; ++ix)
        {// 找单词起始的的A或a
            if ((str[ix] == ‘a’ || str[ix] == ‘A’) && (str[ix – 1] == ‘ ‘ || ix == 0))
            {
                // 找以A或a开始单词的结尾N或n
                string::size_type iy;
                for (iy = ix; str[iy] != ‘ ‘ && iy != in; ++iy);
                if (str[iy – 1] != ‘n’ || str[iy – 1] != ‘N’ )
                {
                    reverse(str,ix,iy – 1);
                }
            }
        }
    }
}

void reverse(string& str, string::size_type ix, string::size_type iy)
{
    if (ix == iy)
        return;
    else
    {
        string::value_type temp = str[ix];
        for (string::size_type x = ix; x != iy; ++x)
        {
            str[x] = str[x + 1];
        }
        str[x] = temp;
        reverse(str, ix, iy – 1);
    }
}

reverse函数是一个利用递归逆序字符串的函数。它的思想是先将长度为n的字符串首元素保存到临时变量temp,然后将剩余的字符串前移,再将临时变量放在字符串尾,最后调用reverse函数将从字符串首开始n-1长度的字符串逆序。
fn的思想是先找到以字符a或A开始的串,然后判断这个单词是否以n或N结尾。如果是,则将该单词逆序。
程序我试着用了下最近才看的STL,有点收获呵呵。我发现string的使用基本和数组一致。string的元素可以用char、int等内置类型接收,也可以用string::value_type。string的长度可以使用string::size_type。
还有getline函数不会提取流中的回车,但可以提取空格。

 

点赞