题目描述
JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
#include <iostream>
using namespace std;
void Reverse(char* pBegin, char* pEnd)
{
if(pBegin == NULL || pEnd == NULL)
return;
while(pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
pBegin++;
pEnd--;
}
}
char* ReverseWordsInSentence(char* str)
{
if(str == NULL)
return NULL;
char* pBegin = str;
char* pEnd = str;
while(*pEnd != '\0')
pEnd++;
pEnd--;
Reverse(pBegin, pEnd);
pBegin = pEnd = str;
while(*pBegin != '\0')
{
if(*pBegin == ' ')
{
pBegin++;
pEnd++;
}else if(*pEnd == ' ' || *pEnd == '\0' )
{
Reverse(pBegin, --pEnd);
pBegin = ++pEnd;
}else
pEnd++;
}
return str;
}
// ====================测试代码====================
void Test(char* testName, char* input, char* expectedResult)
{
if(testName != NULL)
printf("%s begins: ", testName);
ReverseWordsInSentence(input);
if((input == NULL && expectedResult == NULL)
|| (input != NULL && strcmp(input, expectedResult) == 0))
printf("Passed.\n\n");
else
printf("Failed.\n\n");
}
// 功能测试,句子中有多个单词
void Test1()
{
char input[] = "I am a student.";
char expected[] = "student. a am I";
Test("Test1", input, expected);
}
// 功能测试,句子中只有一个单词
void Test2()
{
char input[] = "Wonderful";
char expected[] = "Wonderful";
Test("Test2", input, expected);
}
// 鲁棒性测试
void Test3()
{
Test("Test3", NULL, NULL);
}
// 边界值测试,测试空字符串
void Test4()
{
Test("Test4", "", "");
}
// 边界值测试,字符串中只有空格
void Test5()
{
char input[] = " ";
char expected[] = " ";
Test("Test5", input, expected);
}
int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
return 0;
}