C语言强化(九)翻转句子中单词的顺序

本文介绍了一种使用栈数据结构来翻转英文句子中单词顺序的方法,详细讲解了如何获取用户输入的字符串,如何使用cin.getline()避免丢失空格后的字符,以及如何利用栈的先进后出特性实现单词顺序的翻转。

这是到很常见的题目,非常简单,但你用到数据结构了吗,或者说你用对了吗?


通过这道题,你可以掌握:

  • 如何将用户的输入,输出到控制台
  • 如何分割字符串
  • 如何正确使用数据结构


题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。标点符号和普通字母一样处理。

 例如输入“I am a student.”,则输出“student. a am I”。


思路

一、获取字符串

首先要能够获取到用户输入的一串字符串,有两点需要注意:

1.如果使用cin<<,输出时会发现空格之后的字符串不被输出,如下图


解决方法:使用cin.getline(str,length)

2.由于用户输入的字符串长度一般不会和我们创造的字符数组长度一样,所以如果采用传统的i<str.size()去遍历,会发现输出很多个“烫”,因为数组没有初始化

如下图


解决方法:使用strlen(str)获取字符数组有效长度。


下面是用户输入输出的代码

<span style="font-size:14px;">	char str[100];
	//输入提示
	cout<<"请输入,长度少于100"<<endl;
	//用户输入
	cin.getline(str,100);
	cout<<"所输入的字符串长度为:";
	//输出长度
	cout<<strlen(str)<<endl;
	//输出内容
	for(int i=0;i<strlen(str);i++){
		cout<<str[i];
	}
	cout<<endl;</span>

二、翻转

实现了输入输出后,就是关键的翻转字符串了。

怎样进行翻转?利用字符数组的角标变换???拜托,这不是当初我们刚刚学习C语言时采用的方法吗,而对于学过数据结构的人来说,第一反应想到的是这么个宝贝——

先进后出,这是栈的特性!这在前面C语言强化(二)设计可以求最小元素的栈讲过。

把先输入的字符串放进栈中,最后出来的顺序不就翻转了吗?

所以我们要做的就是把字符串分割成一个个子串,然后塞进去栈中,再取出来,搞定!


翻转函数代码

<span style="font-size:14px;">void reverseStr(char * str){
	//截取,使用栈结构实现翻转输出
	char * p; 
	vector<char*> vt;
	const char * split = " "; 
	p = strtok (str,split); 
	while(p!=NULL) { 
		//cout<<p;
		vt.push_back(p);//塞进去栈中
		p = strtok(NULL,split); //继续分割字符串
	} 
	//利用栈结构的特性,从上往下遍历
	while(vt.size()>0){
		cout<<vt[vt.size()-1]<<" ";
		vt.pop_back();
	}
	cout<<endl;	
}</span>


完整源代码

<span style="font-size:14px;">#include <stdio.h>
#include<stdlib.h>
#include <iostream>
#include<sstream>
#include <vector>

using namespace std;

/**

翻转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

思路
1.用户输入一串字符串,把它输出来
2.截取,使用栈结构实现翻转输出
*/

void reverseStr(char * str){
	//截取,使用栈结构实现翻转输出
	char * p; 
	vector<char*> vt;
	const char * split = " "; 
	p = strtok (str,split); 
	while(p!=NULL) { 
		//cout<<p;
		vt.push_back(p);//塞进去栈中
		p = strtok(NULL,split); //继续分割字符串
	} 
	//利用栈结构的特性,从上往下遍历
	while(vt.size()>0){
		cout<<vt[vt.size()-1]<<" ";
		vt.pop_back();
	}
	cout<<endl;	
}

void main()
{
	/*
	输入输出
	*/
	char str[100];
	//输入提示
	cout<<"请输入,长度少于100"<<endl;
	//用户输入
	//cin>>str;//不可以这样!
	cin.getline(str,100);
	cout<<"所输入的字符串长度为:";
	//输出长度
	cout<<strlen(str)<<endl;
	//输出内容
	//cout<<str<<endl;
	/*
	//不能这样输出!
	for(int i=0;i<100;i++){
		cout<<str[i];
	}
	*/
	for(int i=0;i<strlen(str);i++){
		cout<<str[i];
	}
	cout<<endl;

	reverseStr(str);
	system("pause");
}</span>

之所以要学习数据结构,就是因为很多现实问题都是满足数据结构模型的。比如此题的【翻转——栈】

转载于:https://www.cnblogs.com/javdroider/p/5184289.html

在C语言中,要实现输入一个英文句子并反转单词顺序的功能,可以按照以下步骤操作: 1. 首先,你需要读取用户的输入,这通常通过`scanf`函数完成,例如 `%s`用于读取字符串。 2. 然后,对字符串进行处理。由于C语言原生并不支持内置的字符串反转,你可以创建两个指针,一个指向开始位置(通常是原始字符串),另一个从后向前遍历字符串。 3. 当找到一个空格或者到达字符串结尾时,说明找到了一个完整的单词,此时交换这两个指针所指向的字符,并将指针向中间移动。 4. 继续这个过程,直到两个指针相遇,整个字符串就翻转单词顺序。 5. 最后,记得打印出结果。 下面是一个简单的示例代码片段: ```c #include <stdio.h> #include <string.h> void reverseWords(char* str) { int start = 0; for (int end = 0; str[end] != '\0'; end++) { // 遍历到字符串结束 if (str[end] == ' ') { // 找到单词边界 char temp = str[start]; str[start++] = str[end]; // 交换单词首尾字符 str[end] = temp; } } // 如果最后一个单词没有空格,则需要单独处理 if (start < end) str[start] = '\0'; } int main() { char sentence[1000]; printf("Enter a sentence in English: "); fgets(sentence, sizeof(sentence), stdin); // 读取整行输入 sentence[strlen(sentence) - 1] = '\0'; // 去除换行符 reverseWords(sentence); printf("Reversed words: %s\n", sentence); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值