翻转单词的顺序

来源:互联网 发布:ipad 家长控制软件 编辑:程序博客网 时间:2024/04/28 10:53

     问题:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和和普通字母一样处理。例如输入字符串"I am a student",则输出".student  a  am I"

     算法思想:翻转两次就够了,第一次翻转整个句子得到"tneduts a ma I" ;第二次翻转每个单词得到".student  a  am I"

     详细的实现代码如下:

char* ReverseSentence(char *pData){    if(pData == NULL)        return NULL;    char *pBegin = pData;    char *pEnd = pData;    while(*pEnd != '\0')        pEnd ++;    pEnd--;    // 翻转整个句子    Reverse(pBegin, pEnd);    // 翻转句子中的每个单词    pBegin = pEnd = pData;    while(*pBegin != '\0')    {        if(*pBegin == ' ')        {            pBegin ++;            pEnd ++;        }        else if(*pEnd == ' ' || *pEnd == '\0')        {            Reverse(pBegin, --pEnd);            pBegin = ++pEnd;        }        else        {            pEnd ++;        }    }    return pData;}// ====================测试代码====================void Test(char* testName, char* input, char* expectedResult){    if(testName != NULL)        printf("%s begins: ", testName);    ReverseSentence(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 _tmain(int argc, _TCHAR* argv[]){    Test1();    Test2();    Test3();    Test4();    Test5();    return 0;}


0 0
原创粉丝点击