[英]Extracting words from a string - delicate problem
我需要幫助從 C++ 中的字符串中提取單詞。 在我嘗試完成的練習的定義中,單詞是由不是字母或數字的字符(例如,標間符號、空格等)包圍的任何字母和數字序列。 例如:
This.Is.a.String
我的程序應該創建一個字符串向量,其中向量的元素將是提到的字符串中的單個單詞,在本例中為“This”、“Is”、“a”、“String”。
我嘗試使用 for 循環遍歷給定的字符串,並檢查一個條件,即每當我們現在所處的字符是(通過 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;
}
PS我對C++很陌生。 我知道這不是解決方案,但我必須從某個地方開始。 如果你們中的任何人能幫助我在這里做什么,我將非常感激! 這有點令人沮喪。
感謝並抱歉占用您的時間!
你有一個無限的 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>
或更好的語言環境對應項中使用標准的字符分類謂詞。
不確定您是否被允許,但代碼如下所示:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.