(来源:牛客网)
题目:
将一个字符串str的内容颠倒过来,并输出。
数据范围:1≤len(str)≤10000
输入描述:
输入一个字符串,可以有空格
输出描述:
输出逆序的字符串
示例1
输入
I am a student
输出
tneduts a ma I
示例2
输入
nowcoder
输出
redocwon
问题解析:
逆置字符串和逆置数组本质是一样的,就是首、尾两个指针指向的内容交换,指针移动往中间推进,直到相遇。
第一步
首先我们得处理:输入字符串。
我们创建一个字符数组,因为数据范围:1≤len(str)≤10000 ,所以数组大小最好为10001而不是10000,预留一个'\0'的空间。
char str[10001]={0};
注意:scanf在读字符串时,遇到'\0'会结束,而我们的要求是输入可以有空格。所以写成下面这样是不行的。
scanf("%s",str);
为了解决这个问题,这时我们应该使用的函数是gets。它的头文件是stdio.h。
gets可以无限读取,不会判断上限,从stdin流中读取字符串,以回车或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。
#include<stdio.h>
int main()
{char str[10001];gets(str);//这样就能输入一个字符串(可有空格)到str中reverse(str);//将字符逆序封装为函数printf("%s\n",str);return 0;
}
第二步
那么,现在问题就是,我们怎么来逆序呢(怎么写函数reverse)?
我们传的是数组名,而数组名本身就是指针,所以属于传址调用,所以会改变main函数中数组str的内容,也就意味着我们的返回类型可以是void。
我们就可以搭出函数的框架:
void reverse(char str[])//or void reverse(char* str)
{//
}
字符逆序的实现逻辑
上面已经说了,其实就是创建两个指针,分别存放字符串的首字符地址和最后一个字符的地址,让其指向的内容交换,指针移动(往中间推进),直到相遇时停止。
可能有人会想到先逆着遍历字符串,然后创建一个新的数组来接收,最后再打印出新数组。但这种方法,并没有前者好,因为要创建一个新数组,而且不如前者贴合题意。
其中,把最后一个字符的地址赋给其中一个指针,需要我们先用strlen()求出字符串的长度:
#include<string.h>int len=strlen(str);
char* left=str;
char* right=&str[len-1];//char* right=left+len-1;
指针移动就一个++,一个--:
void reverse(char* str)
{int len=strlen(str);char* left=str;char* right=&str[len-1];while(left<right){char tmp;//创建中间变量来帮助交换tmp=*left;*left=*right;*right=tmp;left++;right--;}
}
完整代码参考:
#include <stdio.h>
#include<string.h>
void reverse(char* str)
{int len=strlen(str);char* left=str;char* right=&str[len-1];while(left<right){char tmp;tmp=*left;*left=*right;*right=tmp;left++;right--;}
}
int main()
{char str[10001]={0};gets(str);reverse(str);printf("%s",str);return 0;
}
到此,本文就结束了,祝阅读愉快^_^