PAT_Basic.Level_1009. 说反话
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:Hello World Here I Come输出样例:
Come I Here World Hello
#include<iostream>
#include<string>
#include<string.h>
#define NUMBER 80
using namespace std;
int main()
{
string input; //输入的字符串
char output[40][NUMBER]={'\0'}; //存放已分割单词的数组
int count = -1;//单词个数
int currentWordLength = 0;//当前单词的长度
int flag = 0; //判断单词 1:单词 0:空格
getline(cin,input);
for(int i = 0; i<input.size(); i++)
{
if(input[i] != ' ') //当前字符不是空格
{
if(flag == 1) //表示一个单词还未结束
{
currentWordLength++;
if(i == input.size()-1) //最后一个单词
{
strncpy(output[count],&input[i-currentWordLength+1],currentWordLength);
}
}
else if(flag == 0)//表示一个单词的开始
{
count++;
currentWordLength = 1;
flag = 1;
if(i == input.size()-1)
{
strncpy(output[count],&input[i-currentWordLength+1],1);//最后一个单词只有一个字符
}
}
}
else if(input[i] == ' ')//当前字符是空格
{
if(flag == 1)//表示一个单词的结束
{
/*
将这个单词拷贝到输出数组
flag = 0
currentWordLength = 0
*/
strncpy(output[count],&input[i-currentWordLength],currentWordLength);
flag = 0;
currentWordLength = 0;
}
else if(flag == 0)//表示仍然未遇到一个单词
{
//forget it!
}
}
}
//至此,单词已经分割完毕
for(int i = count; i >= 1; i--)
{
cout<<output[i]<<" ";
}
cout<<output[0];
return 0;
}
心得:
char *strncpy( //此函数需要包含的头文件<string.h>(非<string>) char *strDest, //Destination string. const char *strSource, //Source string. size_t count //Number of characters to be copied. );