您的位置:首页 > 其它

1009.说反话(三种方法)

2017-05-23 15:19 183 查看
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

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

输出格式:

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

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

方法1(对应本地文件1009_3)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main()
{
char s[90],temp[90][20];
gets(s);
int length = strlen(s),flag=1,count=1,j=0,k=0;
for(int i=0;i<length;i++)
{
if(s[i]==' '&&flag==1)
{
temp[j][k]='\0';//  表明一个单词检索完毕
j++;
k=0;
flag=0;
count++;   //count  代表单词数目
}

if(s[i]!=' ')
{
temp[j][k++]=s[i];
flag=1;
}
}
temp[j][k]='\0';
for(int i=count-1;i>0;i--)
cout<<temp[i]<<" ";//按照第一维坐标倒序输出
cout<<temp[0];
return 0;
}


由于gets(s),可能会出现缓冲区溢出漏洞,所以目前它已经被废除。

修改办法

用fgets来代替,用法:

fgets(s,sizeof(s),stdin);


但是又会出现新的问题,fgets会把回车键也读进去,因此在后面的怕判断处要防止这种情况:



if(s[i]!=' ')


改为

if(s[i]!=' '&&s[i]!='\n')


即可。

方法2(本地1009)

#include <iostream>
#include <string.h>
#include <vector>
using namespace std;

int main()
{
vector<string> v;
string str;
getline(cin,str);
string temp="";
for(int i=0;i<str.length();i++)
{
if(str[i]=='\n')
break;
if(str[i]!=' ')
temp+=str[i];
else
{
v.push_back(temp); //push_back 用法见C++ Primer Plus Page678
temp="";
}
}
v.push_back(temp);
for(int i=v.size()-1;i>=0;i--)
{
if(i!=0)
cout<<v[i]<<" ";
else
cout<<v[i];
}
return 0;
}


方法3(本地1009_2)

//方法2,用 strtok函数切分
#include <iostream>
#include <cstring>
#include <vector>
#include <stdio.h>
using namespace std;
int main()
{
char str[80];
const char* ch=" ";
char* result;
vector<char *> v;
//cin>>str ;   不能用cin  cin读到空格就停止了
gets(str);            //C++11中 gets被从标准库中删除了,如果使用必须加入stdio.h头文件

result=strtok(str,ch);
while(result!=NULL)
{
v.push_back(result);
result=strtok(NULL,ch);
}
for(int i=v.size()-1;i>=0;i--)
{
if(i!=0)
cout<<v[i]<<" ";
else
cout<<v[i];
}
return 0;
}


方法3中的 strtok函数用法

函数原型:char * strtok (char str, const char delimiters);

参数:str,待分割的字符串(c-string);delimiters,分割符字符串。

该函数用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delimiters中包涵的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: