/************************************************************************ ***By : summon *** ***Date : 2010.01.22 *** ***function : 实现一个字符串的反转,不能借助任何的中间变量 *** ***Method : 利用递归代替循环,利用典型的交换两个变量的方法 *** ***Version : V1.0 *** /************************************************************************/ #include "stdafx.h" #include <string.h> #include <stdio.h> #include <stdlib.h> #include <iostream.h> #define MAX 100 typedef int STATUS; STATUS InputString(char *&sourceStr); char *ReverseStr(char *sourceStr); STATUS OutputString(char *sourceStr); int main(int argc, char* argv[]) { char *str; int ret = -1; ret = InputString(str); char *resoult = ReverseStr(str); ret = OutputString(resoult); return 0; } STATUS InputString(char *&sourceStr) { printf("Please input a string!/n"); sourceStr = (char *)malloc(sizeof(char)*MAX); memset(sourceStr, 0, MAX*sizeof(char)); fflush(stdin); cin.getline(sourceStr, MAX); return 1; } char *ReverseStr(char *sourceStr) { if (strlen(sourceStr) == 1) { return sourceStr; } if (*sourceStr != NULL) { *sourceStr = *sourceStr + *(sourceStr + strlen(sourceStr) - 1); *(sourceStr + strlen(sourceStr) - 1) = *sourceStr - *(sourceStr + strlen(sourceStr) - 1); *sourceStr = *sourceStr - *(sourceStr + strlen(sourceStr) - 1); //位操作符<<的左操作数是整形,会强制类型转换(吧一个char类型前面加零),以str=="hello"为例, //内存变换为(低->高)68 65 6c 6c 6f 00 其中6f被强制转换为006f(数值而非内存),然后左移8位变为6f00(数值而非内存),然后赋值给 //指向hello中o起始的两个字节,在内存中是从小到大的,在数值中6f00是从高位到低位的。因此赋值后内存变为68 65 6c 6c 00 6f *(unsigned short*)(sourceStr + strlen(sourceStr) - 1) = (*(sourceStr + strlen(sourceStr) - 1))<<8; ReverseStr(sourceStr + 1); //解释同上,注意分清内存的高低位和数值的高低位 *(unsigned short*)(sourceStr+strlen(sourceStr)) = *(sourceStr+strlen(sourceStr)+1); } return sourceStr; } STATUS OutputString(char *sourceStr) { if (sourceStr == NULL) { return 0; } printf("The reverse string is:%s/n", sourceStr); free(sourceStr); return 1; }