当前位置:网站首页>C语言之实现倒置字符串的两种方法
C语言之实现倒置字符串的两种方法
2022-08-09 19:07:00 【代码陈帅】
目录
前言:
今天在牛客网上刷了一道题,我感觉挺有意义的,现在我就分享给大家,并且告诉大家解题思路。
一、题目
事例:
输入下列字符:
I like beijing.
输出的字符:
beijing. like I
二、思路讲解
1、设立一个数组存放输入的字符串
2、将其中每个单词进行逆置 得到 I ekil .gnjieb
3、再将字符串逆置 得到beijing.like I
三、代码实现
1.设立一个数组存放输入的字符串
#include <stdio.h>
int main()
{
char arr[100] = { 0 };
gets(arr);//注意没有使用scanf,因为scanf遇到空格就会停止接收输入的内容
printf("%s\n",arr);
return 0;
}
2、将每个单词进行逆置
这其中需要注意几点:
1.整个语句如何结束循环
2.每个单词的起始位置和结束位置
3.内部如何实现
4. 判断语句结束,从而停止逆序
语句如何结束循环:
char* t = arr;//将字符数组首元素的地址放入指针变量t中
while (*t!='\0') {
//判断当*t指向'\0’时循环结束。
}
每个单词的起始位置和结束位置 :
char* t = arr;//将字符数组首元素的地址放入指针变量t中
while (*t!='\0') { //判断当*t指向'\0’时循环结束。
char* start = t;
char* end = t;
//当末指针指向空格,并且指向‘\0’循环结束。
while (*end != ' '&&*end != '\0') {
end++;
}
内部怎么实现:
我们需要再自己定义一个函数reverse,用来实现字符串的交换
void reverse(char* left, char* right) {
while (left < right) {//只有当左边的地址小于右边的地址时,才交换,中间的不需要交换
char tmp = *right;
*right = *left;
*left = tmp;
left++;
right--;
}
}
再调用这个函数:
int main() {
char arr[100] = { 0 };
gets(arr); //输入字符数组
char* t = arr;//将字符数组首元素的地址放入指针变量t中
while (*t!='\0') { //判断当*t指向'\0’时循环结束。
char* start = t;
char* end = t;
//当末指针指向空格,并且指向‘\0’循环结束。
while (*end != ' '&&*end != '\0') {
end++;
}
reverse(start, end - 1);
}
怎样判断语句结束呢,从而停止逆序呢
if (*end != '\0')//判断是否到了字符串末尾
t = end + 1;//让指针p指向下一个单词,让循环进入下一个单词
else
t = end;
3、将字符串逆置
这个要用到计算字符串长度的strlen函数,
int len = strlen(arr);
再调用reverse函数:
reverse(arr, arr + len - 1);
四、代码总结
void reverse(char* left, char* right) {
while (left < right) {
char tmp = *right;
*right = *left;
*left = tmp;
left++;
right--;
}
}
int main() {
char arr[100] = { 0 };
gets(arr); //输入字符数组
char* t = arr;//将字符数组首元素的地址放入指针变量t中
while (*t!='\0') { //判断当*t指向'\0’时循环结束。
char* start = t;
char* end = t;
//当末指针指向空格,并且指向‘\0’循环结束。
while (*end != ' '&&*end != '\0') {
end++;
}
reverse(start, end - 1);
if (*end != '\0')//判断是否到了字符串末尾
t = end + 1;//让指针p指向下一个单词,让循环进入下一个单词
else
t = end;
}
int len = strlen(arr);
reverse(arr, arr + len - 1);
printf("%s\n", arr);
return 0;
}
五、第二种方法倒置字符串
方法二的思路是这样先用t指向字符串的末尾,然后往前走,找到空格时,printf一下,以%s格式,这样打印只需要给字符串的首地址,它打印到\0停下。我们打印完一个单词后,把t的位置变成\0,然后继续往前走,直到数组开始位置。
t指针开始指向字符串最后一个字符,然后往前遍历,直到空格或者t到了最开始的字符位置,这里分两种情况,到空格位置,要把空格位置变成\0,打印cur+1位置,到首字符,打印cur位置。
其中需要注意一点,我们把空格位置变成了\0,所以在第一种情况需要打印的时候在加个空格
代码如下:
int main()
{
char arr[100] = { 0 };
gets(arr);
char* t = arr + strlen(arr) - 1; //将t指针指向字符串最后一个字符
while (t > arr) //当t指针的地址大于arr首元素地址开始循环
{
while (*t != ' ' && t > arr) //当t不为空格时,t指针往前循环指向
{
t--;
}
if (t == arr)
{
printf("%s", t);
}
else //到空格,打印t+1位置
{
printf("%s ", t + 1);
*t = '\0'; //把空格位置变成‘\0’
}
}
return 0;
}
六、总结
今天的分享就到这了,第一种方法用数组,字符串逆置,容易想到,第二种方法,思路难,代码简单,两种方法都可以,今天的分享就到这了,谢谢大家的支持。
边栏推荐
- 小满nestjs(第六章 nestjs cli 常用命令)
- Win11找不到Internet Explore怎么办
- Environment: Flink version: 1.15.1 jar package: flink-sql-connector-oracle
- 小满nestjs(第三章 前置知识装饰器)
- buuctf(探险2)
- 毕昇编译器优化:Lazy Code Motion
- DP-Differential Privacy概念介绍
- 小满nestjs(第四章 前置知识装饰器-实现一个GET请求)
- Flume (五) --------- 自定义 Interceptor、自定义 Source 与 自定义 Sink
- 听音识情绪 | 程序员手把手教你搭建神经网络,更快get女朋友情绪,求生欲max!
猜你喜欢
随机推荐
基于网络数据流的未知密码协议逆向分析
Toronto Research Chemicals加米霉素-d4说明书
软件测试技术之如何编写测试用例(6)
OpenSSL SSL_read: Connection was reset, errno 10054
EsgynDB Troubleshooting - ERROR[2012] Server process tdm_arkesp could not becreated
技术分享 | 接口自动化测试如何处理 Header cookie
laravel之phpunit单元测试
Tims中国上市进入倒计时:年亏3.8亿 估值降至14亿美元
tki-tree 树组件控制默认展开第几层数据
基于SSM实现手机销售商城系统
不经意传输协议OT
安装多版本php(php5.6,php7.2)
听音识情绪 | 程序员手把手教你搭建神经网络,更快get女朋友情绪,求生欲max!
源码编译安装与yum和rpm软件安装详解
Laravel DB批量更新的方法
【kali-权限提升】(4.2.7)社会工程学工具包:权限维持创建后门、清除痕迹
解决执行Command报错executable file not found in $PATH
为什么maxcompute的数据导入到mysql会乱码?mysql的表是udf8mb4的编码
matlab 神经网络 ANN 分类
2022深圳(软考中级)系统集成项目管理工程师报名