//通过不同的方法,实现对所输入字符串的反转,可以很好地复习巩固 C++ 基础知识
/*分析过程:
假设要使传递的字符串为常量const字符串,这样操作更加灵活,可直接传递字符串字面值进行反转,常见的解决方法就是,定义一个新的与传递过来字符串长度
相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,然后采用循环来对字符数组中字符反转
*/
/*第一种,采用以上思路解法,传递为const类型C风格字符指针,返回为char*类型*/
//直接使用字符数组赋值
1 char* strrev1(const char* str) 2 { 3 const size_t length = strlen(str);//求字符长度 4 char *temp = new char[length];//新建一个等长度的字符数组 5 strcpy(temp,str);//字符串拷贝 6 for (size_t i = 0; i <= length/2; ++i)//对字符数组中的字符反转,循环执行条件为标识小于或等于字符长度一半 7 { 8 char c = temp[i]; 9 temp[i] = temp[length - i -1]; 10 temp[length - i -1] = c; 11 } 12 return temp;//返回反转后的字符 13 }
//采用指针操作方式
1 char* strrev2(const char* str) 2 { 3 char* tmp = new char[strlen(str)]; 4 strcpy(tmp,str); 5 char* ret = tmp;//用来最后返回数组指针 6 char* p = tmp + strlen(str) - 1; 7 while (p > tmp) 8 { 9 char t = *tmp; 10 *tmp++ = *p; 11 *p-- = t; 12 } 13 return ret; 14 }
//与上一函数基本相似,只不过本函数使用是移位操作改变字符指针指向
1 char* strrev3(const char* str) 2 { 3 char* tmp = new char[strlen(str) + 1]; 4 strcpy(tmp,str); 5 char* ret = tmp; 6 char* p = tmp + strlen(str) - 1; 7 while (p > tmp) 8 { 9 *p ^= *tmp; 10 *tmp++ ^= *p; 11 *p-- ^= *tmp; 12 } 13 return ret; 14 }
//节省几步,直接给新建的字符数组赋反转的值,呵呵,简单明了,只不过循环多执行几次
1 char* strrev4(const char* str) 2 { 3 char * temp = new char[strlen(str)]; 4 for(int i = 0; i <= strlen(str); i++) 5 { 6 temp[i] = str[strlen(str) - i -1]; 7 } 8 return temp; 9 }
//使用递归进行字符反转,网上看的,不过感觉不好,限制太多
//(不能直接反转常量字符串,因为没有定义新的字符数组,而是在原数组上直接进行字符反转,节省空间,提高效率,还要传递字符长度,增加限制,但总归是个思路)
1 char* strrev5 (char* str,int len) 2 { 3 if (len <= 1) 4 return str; 5 char t = *str; 6 *str = *(str + len -1); 7 *(str + len