PAT乙类1009 说反话 (20 分)

一、 题目

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:
每个测试用例的输出占一行,输出倒序后的句子。

输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello

二、代码

  • 核心函数
  1. 未使用的getline(cin, str2); 此函数直接读入输入的一行到str2字符数组中,包含换行符、空格!!注意使用的是char数组,不是string(也就是说ACM中直接读入一行未知何时结束的数据的时候,这种方法可以奏效;读入一行后自动运行下面的代码)
  2. getchar: 读入一个字符,包含换行符,空格。
  3. 上面的两个关键方法就是来解决 输入不知道何时终结的字符的方法!!!!!
  • 分析
    1) 我原来想法: 我原来打算使用string数组来做,结果发现无法判断何时结束输入,’\n’只是字符,string压根不识别!!
    2) 本题采用了定义数组来记录空格的方法求解。 空格与空格之间的间隙就是每个单词。
    3)因为要满足每个单词前后都有空格,所以第一个单词的前面和最后一个单词的后面都要加一个空格,这样所有单词的处理就会一致。 for(i=strSign[k-1]+1; i<strSign[k]; i++) 。 从前一个空格下一个开始读,到下一个空格的前一个结束。。

  • 易错点
    1) 注意在第一个单词前面和最后一个单词的后面都要添加空格
    2)不要忘记,最后输入没有空格

#include <iostream>
#include <stdio.h>
using namespace std;

int main() {
	char str[200];
	char strSign[100] = {0};
	strSign[0] = -1;
	//string str2;
	int i=0, j=1, k;
	//getline(cin, str2);      //geline读入一行数据,而且读入的是字符串string,不是char 不包含换行符!!!! 
	char c;
	while(1) {
		c = getchar();
		if(c == '\n') {
			break;
		}
		if(c == ' ') {
			strSign[j] = i;
			j++;
		}
		str[i] = c;
		i++;
		//cout<<c;
		
	}
	str[i] = ' ';
	strSign[j] = i;
	for(k=j; k>=1; k--) {
		for(i=strSign[k-1]+1; i<strSign[k]; i++) {
			cout<<str[i];
		}
		if(k != 1) {
			cout<<" ";
		}
	}
	
	return 0;	
}

后补第二种方法!!!

  • 核心函数
  1. 用的char的二维数组!!! 二维数组的行数、列数只要大于就行!!!
  2. 因为题目的例子是一段字符串!!在测试的时候,系统自己会自动中断输入!
    cin是以空格为分隔符的!!将几个字符串分开
  3. 在自己测试的时候,要用crtl + Z 中断输入!!!
#include <iostream>
using namespace std;

int main() {
	char str[20][80];
	int i=0;
	while(cin>>str[i]) {
		i++;
	}
	for(int j=i-1; j>=0; j--) {
		if(j!=i-1) cout<<" ";
		cout<<str[j];	
	}
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值