倒置字符串并输出(牛客网)

写在前面

1.fgets

char*fgets(char*str,int num,FILE*stream);

                              数组名    数组元素个数        

str代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。num 代表的是读取字符串的长度。stream 表示从何种流中读取,可以是标准输入流 stdin,也可以是文件流

fgets()函数的第2个参数指明了读入字符的最大数量。如果该参数的值是n,那么fgets()将读入n-1个字符,或者读到遇到的第一个换行符为止;

fgets() 指定了读取 num个字符放到字符数组 str 中。“加上中间的空格和最后的 '\0' 。

2.scanf("%*[^\n]%*c")

使用scanf 读取字符串 i love peng ge.

读取到的结果只有i,原因是scanf函数读取到空格的时候便结束了读取,那有什么方法用scanf来读取有空格的字符串呢?

 读到'\n'结束读取,并将其读到的数据抛弃,然后再抛弃一个字符(这个字符是'\n')
此时缓存中不存在任何字符
scanf("%*[^\n]%*c");

   #include <stdio.h>
   int main()
   {
       char  c;    
       //直到遇到字符a停止读取,
       //舍弃a
       //读取将a后的一个字符存入变量c
       scanf("%*[^a]%*c%c",&c);
       printf("%c\n",c);
       return 0;
   } 

题目

将一句话的单词进行倒置,标点不倒置。比如 "I like beijing.",经过处理后变为:"beijing. like I"。

字符串长度不超过100。

输入描述:

输入一个仅包含小写字母、空格、'.' 的字符串,长度不超过100。

'.' 只出现在最后一个单词的末尾。

输出描述:

依次输出倒置之后的字符串,以空格分割

输入

I like beijing.

输出

beijing. like I

思路:

将输入的整个句子进行逆序,将输入的  I like beijing. 逆序为 .gnijieb ekil i,在使用指针相关知识,将每个单词进行逆序,最终输出beijing. like i

代码:

逆序部分:

1.

数组名在一般情况下就代表这数组首元素的地址

指向字符串末尾的指针 :

运用strlen函数,计算出字符串长度,再与字符串首地址进行相加,最后减1得到了字符串末尾的地址

int len=strlen(arr)
right=arr+len-1;//得到了字符串末尾的指针

 

如图,左边的指针所指向的内容与右边的指针所指向的内容交换,交换一次后left++,right--

外层使用while循环,当left<+right时停止交换

void reserve(char* left, char* right)
{
	while(left < right)
	{
		char tmp;
		tmp = *left;
		*left = *right;
		*right = tmp;
		right--;
		left++;
	}
}

2.

此时字符串完成了整个逆序,逆序后的结果为        .gnijieb ekil i

接下来需要完成的就是将字符串中一个个单词进行逆序

此时定义一个指针start指向数组的首元素,

并定义另一个指针cur,同样也指向数组的元素

	char* start = arr;
	char* cur = arr;
	while (*cur!='\0')
	{
		while (*cur != ' '&&*cur!='\0')
		{
			cur++;
		}
		reserve(start, cur - 1);
		start = cur + 1;
		if(*cur==' ')
			cur++;
	}

 start不动,cur指针向后遍历,直到遇到空格或者‘\0’时停下

如图是cur第一次碰到空格,此时cur指针指向了空格

 此时第一个单词的首地址和末尾的地址全部找到了

可以运用之前的reserve函数对单词进行逆序,第一次逆序之后得到的结果是

beijing. ekil i

此时cur指向的第一个空格,下一个单词的首地址start=cur+1,如果cur指向的是空格不是\0,cur也+1,与start指向同一处,与上方同理找到末尾的地址后进行这个单词的逆序交换 beijing. like  i

最后对数组进行打印即可

下面是整体代码

#include<stdio.h>
#include<string.h>
void reserve(char* left, char* right)
{
	while(left < right)
	{
		char tmp;
		tmp = *left;
		*left = *right;
		*right = tmp;
		right--;
		left++;
	}
}
int main()
{
	char arr[101] = {0};
	fgets(arr, 101, stdin);
	int len = strlen(arr);
	char*left = arr;
	char* right = arr + len - 1;
	reserve(left, right);//将整个句子逆序
	char* start = arr;
	char* cur = arr;
	while (*cur!='\0')
	{
		while (*cur != ' '&&*cur!='\0')
		{
			cur++;
		}
		reserve(start, cur - 1);
		start = cur + 1;
		if(*cur==' ')
			cur++;
	}
	printf("%s", arr);
	return 0;
}

运行结果如下图:

 

 创作不易,留下你的赞吧

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值