[英]split string - multiple delimiter C++
因此,此用戶將所有輸入都放在一行字符串中,我需要將輸入解析為兩類:用戶年齡和用戶名。 例如,用戶輸入->> [23:Frank] [15:Jack] [45:] [33:sofia] []在這種情況下,我有多個參數(定界符,共3個),它們是[ :],此外,一旦我在結尾遇到[],就需要獲得用戶輸入並停止循環。
這就是我的想法:
string input;
vector<string> age;
vector<string> name;
cin >> input;
while (input != "[]")
{
get age between first [ and :
assign to age variable
get name between : ]
assign to user name variable
................
}
還-如果方括號之一缺少名稱怎么辦?如何分配空白名稱並跳過該部分以便處理其余部分(這意味着我將輸出年齡在其旁邊沒有名稱)。 有關如何獲取和處理數據的任何建議。 我看到了一些諸如Toknizing和booster之類的高級課程,這些課程對我的課程來說是高級的,這就是為什么我在考慮直接使用getline和parse函數的原因。 謝謝。
像您當前正在使用cin一樣讀入令牌
與while循環一樣測試[]
對於內部循環,以下是一些可以幫助您的事情:
std::string
的front
和back
的功能是完美的確保輸入開頭[和結尾為] std::string
的substr
函數非常適合修剪[],因此在其余的解析過程中,您可以輕松忽略它們 std::stringstream
允許您調用僅包含調整后的輸入的流。 std::getline(stream, string, char)
將讀取找到的所有字符,直到char
參數或流的末尾,並將結果填充在string參數中,然后丟棄找到的char
,這樣您就不會絆倒它解析其余的輸入。 strtoul
會將字符串轉換為數字,並告訴您是否失敗。 它不會接受負數,因此您可以抓住試圖欺騙您程序的人。 getline(stream, string)
將讀取流,直到到達行尾標記為止。 非常適合讀取不包含行尾的流的其余部分。 使用strtoul:
char * endp;
unsigned long agenum strtoul(agestr.c_str(), // turn string into old c-style string
&endp, // will be updated with the end of the char after the last number
10); // base ten numbers
if (endp != '\0') // old c-strings always end on a null (numerical zero). If strtoul
// didn't end on a null, the string wasn't a valid number.
{
//not a number
}
好的,謝謝那些幫助過或至少嘗試過幫助過的人!
我最終為此做的工作如下:
find
函數查找我的定界符(在本例中為[:]) 傳遞這些參數結果以使用substr
函數截斷字符串,然后將其分配給每個變量。
while (true) { string myInput; cin >> myInput; while (myInput != "[]") { int age_beg = myInput.find('[') + 1 ; int age_end = myInput.find(':', age_beg); string age = myInput.substr(age_beg, (age_end - age_beg)); int name_beg = age_end + 1; int name_end = myInput.find(']', name_beg); string name = myInput.substr(name_beg, (name_end - name_beg)); cout << "NAME : " << name << " AGE : " << age << endl; cin >> myInput; } }
希望這會在將來幫助其他有同樣問題的人!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.