如何从一行输入的字符串中基于空格切割出单词
2017-03-01 02:46
232 查看
在C++中,可以考虑用已经写好的模板来解题:
重要的是:
这样就把输入的一行字符串切割成了单词。
如果自己手工写,需要注意的边界很细节,要很小心,如果不自己写,就用这种方法来代替,这种方法耗时不少,具体题目具体考虑吧。
基于这个方法,思考一道问题:
每个输入文件中一组数据。
分三行分别给出三条线段的长度。每行以一个整数N(1<=N<=5)开始,表示后面给出的单词个数;接下来跟着N个英文单词,每个单词表示一个数位,线段的长度由这些英文单词直接拼接而成(例如one two three代表123,one one代表11),每两个单词之间用一个空格隔开。数字0到9分别用下面十个单词表示:zero、one、two、three、four、five、six、seven、eight、nine。数据保证每条线段的长度都不为0。
如果可以组成三角形,那么输出YES;否则输出NO。
这个问题,并没用到上面的写法,因为命题者降低了难度,在每一行输入前都加入了一个数字,基于这个数字,就可以简单的按照一个单词一个单词输入了。
代码如下:
如果加一点点变化,问:不在每一行行首输入一个数字,直接这样输入:
那么这个问题就需要用到切割字符串的知识了。
代码如下:
#include <iostream> #include <string> #include <sstream> #include <vector> using namespace std; int main() { string line,word; vector<string> s1; getline(cin,line); // 输入一行数据 // 将一行数据绑定在一起istringstream对象上 istringstream stream(line); while(stream >> word) { s1.push_back(word); } for(auto it = s1.begin(); it != s1.end(); it++) { cout << *it << " " << flush; // 将缓冲区的内容马上送进cout,并把输出缓冲区刷新 } cout << endl; return 0; }
重要的是:
vector<string> str; string line, word; getline(cin, line); // 输入一行数据 istringstream stream(line); //绑定到istringstream对象 while(stream >> word) // 从stream流中取出单词 { str.push_back(word); }
这样就把输入的一行字符串切割成了单词。
如果自己手工写,需要注意的边界很细节,要很小心,如果不自己写,就用这种方法来代替,这种方法耗时不少,具体题目具体考虑吧。
基于这个方法,思考一道问题:
每个输入文件中一组数据。
分三行分别给出三条线段的长度。每行以一个整数N(1<=N<=5)开始,表示后面给出的单词个数;接下来跟着N个英文单词,每个单词表示一个数位,线段的长度由这些英文单词直接拼接而成(例如one two three代表123,one one代表11),每两个单词之间用一个空格隔开。数字0到9分别用下面十个单词表示:zero、one、two、three、four、five、six、seven、eight、nine。数据保证每条线段的长度都不为0。
如果可以组成三角形,那么输出YES;否则输出NO。
Input: 1 one 2 one one 3 one one one Output: NO
这个问题,并没用到上面的写法,因为命题者降低了难度,在每一行输入前都加入了一个数字,基于这个数字,就可以简单的按照一个单词一个单词输入了。
代码如下:
#include <stdio.h> #include <iostream> #include <string> #include <map> #include <algorithm> using namespace std; map<string,int> mp = { {"zero",0},{"one",1},{"two",2},{"three",3},{"four",4}, {"five",5},{"six",6},{"seven",7},{"eight",8},{"nine",9} }; int main() { string s; int arr[3] = {0}; int k; for(int i = 0; i < 3; i++) { cin >> k; for(int j = 0; j < k; j++) { cin >> s; arr[i] = 10 * arr[i] + mp[s]; } } if(arr[0] + arr[1] > arr[2] && arr[0] + arr[2] > arr[1] && arr[1] + arr[2] > arr[0]) { cout << "YES" << endl; } else { cout << "NO" << endl; } return 0; }
如果加一点点变化,问:不在每一行行首输入一个数字,直接这样输入:
one // 代表1 one one // 代表11 one one one // 代表111
那么这个问题就需要用到切割字符串的知识了。
代码如下:
#include <iostream> #include <string> #include <sstream> #include <vector> #include <map> using namespace std; map<string,int> mp = { {"zero",0},{"one",1},{"two",2},{"three",3},{"four",4}, {"five",5},{"six",6},{"seven",7},{"eight",8},{"nine",9} }; int strToNum(vector<string> str) // 根据 { int ans = 0; for(int i = 0; i < str.size(); i++) { ans = 10 * ans + mp[str[i]]; } return ans; } int main() { string s,word; int arr[3] = {0}; int k; for(int i = 0; i < 3; i++) { vector<string> str; getline(cin, s); istringstream stream(s); //绑定到istringstream对象上 while(stream >> word) // 流出单词来 { str.push_back(word); // 加入容器备用 } arr[i] = strToNum(str); } if(arr[0] + arr[1] > arr[2] && arr[0] + arr[2] > arr[1] && arr[1] + arr[2] > arr[0]) { cout << "YES" << endl; } else { cout << "NO" << endl; } return 0; }
相关文章推荐
- 输入一行字符串,统计其中有多少个单词,单词之间用一个或者多个空格分隔开
- 输入一行字符串(单词和若干空格), 输出该行单词个数 这里用到判断字符与否的isalpha
- 字符串(如何输入一行带有空格的字符串)
- 输入一行字符,统计其中有多少单词,单词之间用空格隔开
- 输入一行字符,统计其中有多少个单词,单词之间用空格分开
- 【C++FAQ】怎么输入一行字符串(可能带空格)
- C++如何输入含有空格字符的字符串
- C#如何取出一行中的字符数包括空格,单词
- 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
- 一没考虑单词重复,二没考虑先输入空格,三没考虑后面连续输空格,方法见空格将空格前面的当成一个字符串,字符串比较是否相同,再统计
- Java 从控制台输入中把一行中的以空格分隔的单词取出的函数(Token)
- string不能输入空格,如何输入有空格字符串呢
- 用一个函数实现将一行字符串中最短的单词输出。此行字符串从主函数传递给该函数。假设字符串中包含的单词以空格作为分隔符号,例如”Asia Games 2010 is held in GuangZhou.”,其中最短的单词是”is”和”in”。
- 输入一行字符,统计其中有多少个单词,单词之间用空格隔开
- C++如何连续输入多个可能含空格的字符串
- 1~ 从键盘输入一行字符,统计其中的单词个数。此处认为一个单词是介于空格之间的字符序列。
- C语言:输入一行字符,统计其中有多少单词,单词之间用空格分隔开
- 键盘输入一行字符串,每个单词倒序输出
- 从屏幕输入一行数字,以空格分隔,如何分别存放到数组中
- 做C Programming Language的习题,突发奇想研究如何消除任意多空格或\t,并把格式转换为每个单词占一行