【PAT】1009. 说反话 (20)
1009. 说反话 (20)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:Hello World Here I Come输出样例:
Come I Here World Hello
方法一:
程序说明:
1.输入的字符串存储在数组str[]中,数组pos[]用来存储每个空格所在的位置,count用来存储单词个数,初始值为1;strlen()函数求出字符串的总长度
2.知道每个空格所在的位置、字符串总长度和单词个数即可打印出相应的单词
C++ 代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main() { 5 char str[80]; 6 int pos[80]; 7 int count=1,j=0,i,len; 8 gets(str); 9 len=strlen(str); 10 for(i=0;i<len;i++){ 11 if(str[i]==' '){ 12 count++; 13 pos[j]=i; 14 j++; 15 } 16 } 17 if(count==1){ 18 for(i=0;i<len;i++){ 19 cout<<str[i]; 20 } 21 system("pause"); 22 return 0; 23 } 24 while(count!=1){ 25 for(i=pos[j-1]+1;i<len;i++) 26 cout<<str[i]; 27 len=pos[j-1];j--;count--; 28 if(count!=0) cout<<' '; 29 } 30 for(i=0;i<pos[0];i++) 31 cout<<str[i]; 32 system("pause"); 33 return 0; 34 }
方法二:使用strtok()函数
strtok()函数说明:
1.包含在 #include <string.h> 中
2.函数原型:
char* strtok (char* str,constchar* delimiters );
3.函数功能:以传入的 delimiters为切割符对 str 分割成一个个子串,并返回指向被分割出片段的指针。当 str 中的字符查找到末尾时,返回NULL;
如果查不到 delimiters 所标示的字符,则返回当前 strtok 的字符串的指针
4.函数参数:
str:在第一次被调用的时候 str 为被切割字符串的首地址,在后面调用的时候为NULL
delimiters:将传入的字符当做切割符
C++ 代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 char str[80]; 6 int flag=1; 7 char* result; 8 const char *ch=" "; 9 vector<char *> word; 10 gets(str); 11 result=strtok(str,ch); 12 while(result!=NULL){ 13 word.push_back(result); 14 result=strtok(NULL,ch); 15 } 16 for(int i=word.size()-1;i>=0;i--){ 17 if(flag==1){ 18 cout<<word[i]; 19 flag=0; 20 } 21 else cout<<' '<<word[i]; 22 } 23 system("pause"); 24 }