【手把手带你刷好题】—— 41.说反话(C初阶测试、字符串)

举报
安然无虞 发表于 2022/05/27 00:47:16 2022/05/27
【摘要】 【前言】 今天是刷题打卡第41天! 再接再厉鸭亲们。 原题:倒置字符串 题目描述: 将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I  方法一: 低级解法 思路: 使用gets函数读入一整行,(想想...

【前言】

今天是刷题打卡第41天!

再接再厉鸭亲们。

原题:倒置字符串

题目描述:

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

方法一: 低级解法

思路:

使用gets函数读入一整行,(想想为什么不用scanf()?),从左至右枚举每一个字符,以空格为分隔符对单词进行划分,并按照顺序存放到二维字符数组中,最后按单词输入顺序的逆序来输出所有单词。 

代码执行: 

#include<stdio.h>
#include<string.h>

int main()
{
	char arr[100] = { 0 };
	gets(arr);
	int len = strlen(arr);
	int row = 0;
	int col = 0;
	int i = 0;
	char str[100][100] = { 0 };
	for (i = 0; i < len; i++)
	{
		if (arr[i] != ' ')//如果读到的字符不是空格,放到str数组中,并且令col++
		{
			str[row][col] = arr[i];
			col++;
		}
		else//如果读到的字符是空格,在str数组中放置\0,并且令row++,置col为0
		{
			str[row][col] = '\0';
			row++;
			col = 0;
		}
	}
	for (i = row; i >= 0; i--)//逆序打印,注意哦,最后一个单词后面不要打印空格
	{
		printf("%s", str[i]);
		if (i > 0)
			printf(" ");
	}
	return 0;
}

方法二:高级解法

代码执行:

#include<stdio.h>
#include<string.h>
#include<assert.h>

void reverse(char* start, char* end)
{
	assert(start && end);
	while (start < end)
	{
		char temp = *start;
		*start = *end;
		*end = temp;
		start++;
		end--;
	}
}

int main()
{
	char arr[100] = { 0 };
	gets(arr);
	int len = strlen(arr);
	//1、先逆置每个单词
	//2、再逆置整个字符串
	char* start = arr;
	char* end = start;
	while (*end != '\0')
	{
		if(*end != ' ' && *end != '\0')//注意,最后一个单词后面跟着是\0,比较特殊别忘记多加考虑
		{
			end++;
		}
		reverse(start, end - 1);
		if (*end == ' ')//这个判断语句要要注意理解一下,当end访问到\0时start就不要往后面走了
		{
			start = end + 1;
		}
		else
		{
			start = end;
		}
		end = start;
	}
	//逆置整个字符串
	reverse(arr, arr + len - 1);
	puts(arr);
	return 0;
}

结语 

今天是刷题打卡第41天!

加油吧少年。

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121610033

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。