版权声明:看看就好,如需转载,注明一下出处 https://blog.csdn.net/sinat_34337520/article/details/89228620
Description
写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。
Input
一行字符串(不含空格,长度小于等于100)
Output
逆序后的字符串
Sample Input
123456abcdef
Sample Output
fedcba654321
Note:
字符串逆置,也是很经典的题型。
原题很简单,字符串逆置即可,不过如果限制一些条件或者实现方案,可以产生很多版本的变化。
#include <stdio.h>
#include <string.h>
void reverse(char a[], int len)
{
char tmp;
int i=0;
while(i < len-i-1)
{
tmp = a[i];
a[i] = a[len-i-1];
a[len-i-1] = tmp;
i++;
}
}
int main()
{
char s[100];
int len;
scanf("%s", s);
len = strlen(s);
reverse(s, len);
printf("%s", s);
return 0;
}
拓展:
版本1-4:非递归for 循环实现
//版本1:传入 首地址+字符串长度
void reverse1(char s[], int len)
{
int i, j;
char temp;
for(i=0, j=len-1; i<j; ++i, --j)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
//版本2:传入 首地址,长度在子函数中获取
void reverse2(char s[])
{
int c, i, j;
for(i=0, j=strlen(s)-1; i<j; ++i,--j)
{
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
//版本3:指针方案
void reverse3(char *s)
{
int c;
char *t;
for(t = s+(strlen(s)-1); s<t; s++,t--)
{
c = *s;
*s = *t;
*t = c;
}
}
//版本4:不使用 strlen 函数,获取字符串长度
void reverse4(char s[])
{
int i, j;
char temp;
i = 0;
while(s[i] != '\0')
++i;
--i;
if(s[i] == '\n')
--i; // i 作为 s[] 最末字符下标
//i = strlen(s)-1;
for(j=0; j<i; --i,++j)
{
temp = s[j];
s[j] = s[i];
s[i] = temp;
}
}
版本5-6:递归实现,这里使用的指针访问字符元素
//版本5:传入 首地址+字符串长度
void reverse5(char *s, int len)
{
int t;
if(len < 2)
return;
t = *s;
*s = *(s+len-1);
*(s+len-1) = t;
reverse5(s+1, len-2);
}
//版本6:传入 首地址+末尾地址
void reverse6(char *start, char *end)
{
char t;
t = *start;
*start = *end;
*end = t;
if(start<end)
reverse6(start+1, end-1);
}
还有一种出题方式:逆置正整数
如:输入123456,输出654321
int reverse(int n) // 逆置正整数(非递归)
{
int s=0;
while(n)
{
s = s*10 + n%10; //每一趟s*10 + 个位
n /= 10;
}
return s;
}
目前收集到的就这么多,以后碰到会再添加进来。