在C ++中从字符串中提取单词时,我需要帮助。在我要完成的练习的定义中,一个单词是由字母和数字组成的任意序列,这些序列以非字母或数字的字符为边界(例如,插入点,空格等)。例如:
This.Is.a.String
我的程序应该创建一个字符串向量,其中向量的元素将是提到的字符串中的单个单词,在这种情况下为“ This”,“ Is”,“ a”,“ String”。
我尝试使用for循环遍历给定的字符串,并检查一种条件,即只要我们现在使用的字符是IS(按ASCII值)就介于A和Z(a和z)以及数字0和9,将其放入字符串中。接下来,将该字符串放入向量中,并将字符串的大小调整为0(这样我们就可以输入另一个单词。)这似乎不起作用...
vector<string> Function(string s) {
char letter;
string r;
vector<string> vector_string;
for(int i=0; i<s.length(); i++) {
letter=toupper(s.at(i)); // I do this so all letters are capital letters, so it's easier to compare them
r.resize(0);
while((letter>=65 || letter<=90) && (letter>=48 || letter<=57)) {
r.push_back(s.at(i));
}
vector_string.push_back(r);
}
return vector_string;
}
P.S。我是C ++的新手。我知道这离解决方案不远,但是我必须从某个地方开始。如果您能在此做什么帮助我,我将不胜感激!有点令人沮丧。
谢谢您,抽出宝贵的时间!
答案 0 :(得分:1)
您有一个无限的while循环。并且它的条件不正确。
这里有一个改进:
vector<string> split(string s) {
char letter;
vector<string> vector_string;
for(int i=0; i<s.length(); ) {
if (isalnum(s[i])) {
string r;
do {
r.push_back(s[i++]);
} while(i<s.length() && isalnum(s[i]));
vector_string.push_back(r);
}
else i++;
}
return vector_string;
}
此修订版使用预定的isalnum()
来获取单词中的字母数字字符。
为编写更清晰的条件,通常应首选在<cctype>
或更佳的locale-aware counterparts中使用标准的字符分类谓词。
不确定您是否被允许,但是代码如下所示:
vector<string> split(string s) {
regex word_definition("([a-zA-Z0-9]+)");
auto words_begin = sregex_iterator(s.begin(), s.end(), word_definition);
auto words_end = sregex_iterator();
vector<string> vector_string;
for(auto i = words_begin; i!=words_end; i++) {
vector_string.push_back(i->str());
}
return vector_string;
}