针对这一题目给出自己的代码:
#include <stdio.h>
#include <string.h>
/* By LYG */
void rev1(char *c);
void rev2(char *c);
void rev3(char *c);
int main(void)
{
char str[]="abcde";
printf("原字符串为 \n%s\n",str);
int rev;
printf("请输入要验证的方法(1-3的整形数字):\n");
scanf("%d",&rev);
switch(rev)
{
case 1:
rev1(str);
printf("改变后的字符串为\n%s\n",str);
break;
case 2:
rev2(str);
printf("改变后的字符串为\n%s\n",str);
break;
case 3:
rev3(str);
printf("改变后的字符串为\n%s\n",str);
break;
default:
printf("Error!");
}
return 0;
}
void rev1(char *ch)
/*利用
'\n'当做临时交换空间
*/
{
int len =strlen(ch);
for (int i = 0; i < (len-1)/ 2; i++)
{
ch[len]=ch[i];
ch[i]=ch[len-1-i];
ch[len-1-i]=ch[len];
}
ch[len]='\0';
}
void rev2(char *ch)
/*利用
a=a+b;
b=a-b;
a=a-b;
*/
{
int len =strlen(ch);
for (int i = 0; i < (len-1)/2; i++)
{
ch[i] = ch[i] + ch[(len - 1) - i];
ch[(len-1) - i]= ch[i]- ch[(len -1) - i];
ch[i] = ch[i]- ch[(len - 1) - i];
}
}
void rev3(char *ch)
/*利用
a^=b;
b^=a;
a^=b;
*/
{
int len =strlen(ch);
for (int i = 0; i < (len-1)/ 2; i++)
{
ch[(len -1)- i] ^= ch[i];
ch[i] ^= ch[(len -1)- i];
ch[(len -1)- i] ^= ch[i];
}
}
总结一下:
“字符数组或者字符串下”进行逆序存储(如char[]):
- 不要求"不能开辟额外空间"可以用“临时变量temp”座位临时空间对"字符数组或者字符串"进行逆序存储。
- 要求要求"不能开辟额外空间"可以用如下3种方法:
- 利用字符数组或者字符串独有的'\0',把'\0'所占用位置当做临时临时空间来进行逆序存储,最后在恢复'\0'.
- 利用
a = a + b; b = a - b; a = a - b;
来对字符数组或者字符串进行不占用额外空间的逆序存储. - 利用
a ^= b; b ^= a; a ^= b;
来对字符数组或者字符串进行不占用额外空间的逆序存储.
“非字符数组或者字符串下进行逆序存储”下进行逆序存储(如short a[], int a[], long a[],float a[],double a[]等类型数组):
- 不要求"不能开辟额外空间"可以用“临时变量temp”座位临时空间对"字符数组或者字符串"进行逆序存储。
- 要求要求"不能开辟额外空间"可以用如下2种方法:
- 利用
a=a+b; b=a-b; a=a-b;
来对字符数组或者字符串进行不占用额外空间的逆序存储. - 利用
a ^= b; b ^= a; a ^= b;
来对字符数组或者字符串进行不占用额外空间的逆序存储.