首页 > 代码库 > 翻转句子

翻转句子

// 如何翻转单词

 

void reverse_str(char *pBegin, char *pEnd){

    

    if(pBegin == NULL || pEnd == NULL)

        return;

    

    while(pBegin < pEnd){

        

        char temp = *pBegin;

        *pBegin = *pEnd;

        *pEnd = temp;

        

        pBegin ++,

        pEnd --;

    }

}

 

char* ReverseSentence(char *pData){

    

    if(pData =http://www.mamicode.com/= NULL){ return NULL;}

    

    // 两个指针指向同一个地方

    char *pBegin = pData;

    char *pEnd = pData;

    

    while(*pEnd != ‘\0‘){

        

        // 计算pEnd的长度

        pEnd ++; // 指针指向最后一位

        // 注意字符"" ,包含 \0

    }

    

    pEnd--; //  指针指向前最后一个可见字符

    

    // 先翻转整个句子

    reverse_str(pBegin, pEnd);

    

    // 翻转每个单词,重新将end和begin指向字符串的开头

    pBegin = pEnd = pData;

    

    while(*pBegin != ‘\0‘){

        

        // 同时跳过空格

        if(*pBegin == ‘ ‘){

            // 下移动一位

            pBegin ++;

            pEnd ++;

            continue;

            

            // 有单个字符串的要反转

        }else if(*pEnd == ‘ ‘ || *pEnd == ‘\0‘){

            // 一定要倒退一位

            reverse_str(pBegin, --pEnd);

            pBegin = ++pEnd;

            // 在重新设置一次

            // 要先移到下一位

        }else{

            // 以上的条件大多数不满足,则pEnd的指针指向后面

            pEnd ++;

        }

    }

    

    return pData;

}

 

int main(int argc, const char * argv[]) {

    // 数字名

    char pBegin[] = "i am a student."; // 字符串时多一个数组

    printf("%lu \n", sizeof(pBegin)/sizeof(char));

 

    char *reserve = ReverseSentence(pBegin);

    

    for (int i=0; reserve[i] != ‘\0‘; i++) {

        printf("%c", reserve[i]);

    }

    

    printf("\n");

    return 0;

}

 

void reverse_word(char *pStart, char *pEnd){

 

    if (pStart == NULL || pEnd == NULL) {

        return ;

    }

    

    // while (*pStart != ‘\0‘) {

    while(pStart < pEnd){

        

        char temp = *pStart;

        *pStart = *pEnd;

        *pEnd = temp;

        

        pStart++;

        pEnd--;

    }

}

 

翻转句子