翻转句子中单词的顺序

时间:2023-01-08 11:43:33

/*题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“--I am a student.||”,则输出“--student.a am I||”。

思路:翻转“--I am a student.||”中所有字符得到“--.tneduts a ma I||”,
再翻转每个单词中字符的顺序得到“students.a am I”,正是符合要求的输出。*/

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class mystring
{
private:
char *p;
public:
class error
{
public:
virtual void showerror() = 0;
};
class pointer :public error
{
private:
int index;
public:
pointer(int a) :index(a)
{}
void showerror()
{
cout << "pointer error " << index << endl;
}
};

mystring(char *s)
{
if (s == nullptr)
{
throw pointer(0);
}
p = new char[strlen(s) + 1];
strcpy(p, s);
}
~mystring()
{
if (p != nullptr)
{
delete p;
p = nullptr;
}
}
void show()
{
if (p == nullptr)
{
throw pointer(0);
}
cout << p << endl;
}
void StrReverse()
{
StrReverseWithMark(p, strlen(p));
}
void StrReverse(char *p, int n)//形参p优先于成员变量p
{
for (int i = 0; i < n / 2; i++)
{
char temp = p[i];
p[i] = p[n - 1 - i];
p[n - 1 - i] = temp;
}
}
void StrReverseWithMark(char *p, int n)//形参p优先于成员变量p
{
int i(0);
while (*p == '-')
{
p++;
n--;
}
while (p[n - 1] == '|')
{
n--;
}
for (int i = 0; i < n / 2; i++)
{
char temp = p[i];
p[i] = p[n - 1 - i];
p[n - 1 - i] = temp;
}
}
void WordRectify()
{
char *px(p);
char *py(p);
int i(0);
while (px[i])
{
int cnt(0);
while (p[i] && (px[i++] != ' '))
{
cnt++;
}
if (cnt > 1)
{
StrReverseWithMark(py, cnt);
}
py = px + i;
}
}
};

void main()
{
try
{
mystring str("I am a student.");
//mystring str("--I am a student.||");
//mystring str("I am a student .");//fail,程序会把.当成一个字符,因为它与前面的字符之间有空格。
//mystring str("student.");
//mystring str("--student.||");
//mystring str("--我爱你中国.||");
//mystring str("--我爱你 中国.||");
str.StrReverse();
str.show();
str.WordRectify();
str.show();
}
catch (mystring::pointer e)
{
e.showerror();
}
cin.get();
}