1009.说反话(三种方法)
2017-05-23 15:19
183 查看
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
由于gets(s),可能会出现缓冲区溢出漏洞,所以目前它已经被废除。
修改办法
用fgets来代替,用法:
但是又会出现新的问题,fgets会把回车键也读进去,因此在后面的怕判断处要防止这种情况:
将
改为
即可。
方法3中的 strtok函数用法
函数原型:char * strtok (char str, const char delimiters);
参数:str,待分割的字符串(c-string);delimiters,分割符字符串。
该函数用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delimiters中包涵的分割字符时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过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。每次调用成功则返回指向被分割出片段的指针。
相关文章推荐
- 消息窗口的三种使用方法
- 取得系统中网卡MAC地址的三种方法
- 结构成员访问的三种方法
- 图像缩放的三种方法
- Java解析网络数据流的三种特殊方法
- 三种禁用FSO的方法
- 三种禁用FSO的方法
- 三种禁用FSO方法
- 访问 Microsoft SQL Server 元数据的三种方法
- 用VC 6.0实现串行通信的三种方法
- 处理客户端弹出消息的三种方法
- 进行DLL注入的三种方法
- 创建IXMLDOMDocument对象的三种方法
- PB中实现数据窗口动态排序的三种方法
- Delphi中实现文件拷贝的三种方法
- [Palm]关于 Modal Dialogs(Modal Form) 的三种编程方法
- 打开对方CMD的三种方法!
- 用VC 6.0实现串行通信的三种方法
- 取得系统中网卡MAC地址的三种方法