题目是:
读入一行文本,包含若干个单词(以空格间隔,%结尾)。将其中以 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函数不会提取流中的回车,但可以提取空格。