c语言实现-字符串逆序

1.整体思想

输入字符串 I like china. 

如何输出 china. like I 

 1.把大象放冰箱里分几步

1.把字符串整体逆序----------------- .anihc ekil I 

2. 然后把每个单词转过来---------------------china. like I

 2.分布实现(再将两个大步骤细分)

1.第一步实现

 1.把字符串整体逆序----------------- .anihc ekil I 

1.步骤一

首先我们初始化一个字符串数组a为空,从屏幕中读取一个字符串放到a中。

现在思考如何将这个字符串整体翻转呢? 

将字符串首元素和尾巴翻转,重复这一动作 就可以将整个字符串翻转过来。

我们如何获取字符串尾元素呢?

利用strlen ()函数 读取字符串的长度,再减1.

因为strlen()读到‘\0’,减1就是字符串尾元素。

用strlen()函数要包含他的头文件 <string.h>

#include<stdio.h>
#include<string.h>
int main()
{
	char a[]={0};//初始化字符数组
    gets(a);//从屏幕获取一个字符串
	int sz = strlen(a);//获取字符串的长度
	axx(a,a+sz-1);//调用axx实现字符串整体逆序
	printf("%s", a);
	return 0;
}

 gets(a);

只有一个参数。参数类型为 char* 型,即 str 可以是一个字符指针变量名,也可以是一个字符数组名。

gets(a) 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量a所指向的内存空间。

 2.步骤2

axx函数的实现

void axx(char* right,char* left)
{
	
	while (right < left)
	{
		char a = 0;
		a = *right;
		*right = *left;
		*left = a;
		right++;
		left--;
	}
}

1.因为数组名是数组首元素的地址,所以我把a首元素的地址给 right。

 等于char*right=a;  

2.a是数组首元素的地址,a+sz-1(指针移动),就是数组尾元素的地址给left

 等于 char*left= a+sz-1

 3.定义一个char a;作为中转站

  |   a=*right---------right解引用。把right现在指向的地址中的值(首元素)放到中转站a里

  |   *right=*left--------------把left现在指向的地址中的值(尾元素)放到right中

  |   *right=a;-----------把中转站(首元素)放到right

这样就实现了首元素和尾元素的翻转

 1.如何重复这个操作呢?

 需要个循环while

 2.如何实现循环呢 ?       

   right++; 指针加一,指针相后移动一位,现在指针指向的就是字符串第二个元素

   left--;    指针减一,指针相前移动一位,现在指针指向的就是字符串倒数第二个元素

   这样就可以重复翻转的动作了

 3.循环的条件是什么呢?

     right<left,指针比较

     当right<left,说明中间还有元素需要翻转

      当right>=left,说明中间没有元素需要翻转了,退出循环。

            

2.第二步实现 

 如何将每个字符串中的每个单词翻转过来呢

将每个字符串中的每个单词翻转过来


	char* start = a;
	while (*start)
	{
		char* end = start;
		while (*end != ' ' && *end != '\0')
		{
			
			end++;
		}
		axx(start,end-1);
		if (*end != '\0')
		{
			start = end+1;
		}
		else
		{
			start = end;
		}
	}
	

1.现在我们要找到每个单词将每个单词翻转过来 

1. 把翻转后a首元素的地址给start

2.创建一个循环,找每个单词然后再翻转过来,当start指向‘\0’时说明已经找到字符数组的末尾了,退出循环

3.定义一个指针end,把start的地址给end.

4.找到每个单词,所以我们要在这个大循环里再创建一个循环,

 当end指向的是空格说明end之前我们找到一个单词

 当end指向‘\0’说明已经找到头了

 当*end != ' ' && *end != '\0'说明end没找到,end++;指针移动到下一位判断找没找到。

 5.当end指向空格说明end前面是一个单词,我们调用axx(),将start和end中间的单词翻转

 6.如果end指向的不是‘\0’说明没有找到头,

   start=end+1   end的后一个地址重新设置成首地址,继续找

   当end指向‘\0’说明已经找到头了

   退出循环

 3.系统的总实现代码

#include<stdio.h>
#include<string.h>
void axx(char* right,char* left)
{
	
	while (right < left)
	{
		char a = 0;
		a = *right;
		*right = *left;
		*left = a;
		right++;
		left--;
	}
}
int main()
{
	char a[] = { 0 };
	gets(a);
	int sz = strlen(a);
	axx(a,a+sz-1);
	char* start = a;
	while (*start)
	{
		char* end = start;
		while (*end != ' ' && *end != '\0')
		{

			end++;
		}
		axx(start, end - 1);
		if (*end != '\0')
		{
			start = end + 1;
		}
		else
		{
			start = end;
		}
	}
	printf("%s", a);
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值