簡體   English   中英

分割字符串-多個分隔符C ++

[英]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循環一樣測試[]

對於內部循環,以下是一些可以幫助您的事情:

  1. std::stringfrontback的功能是完美的確保輸入開頭[和結尾為]
  2. std::stringsubstr函數非常適合修剪[],因此在其余的解析過程中,您可以輕松忽略它們
  3. std::stringstream允許您調用僅包含調整后的輸入的流。
  4. std::getline(stream, string, char)將讀取找到的所有字符,直到char參數或流的末尾,並將結果填充在string參數中,然后丟棄找到的char ,這樣您就不會絆倒它解析其余的輸入。
  5. strtoul會將字符串轉換為數字,並告訴您是否失敗。 它不會接受負數,因此您可以抓住試圖欺騙您程序的人。
  6. 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
}

好的,謝謝那些幫助過或至少嘗試過幫助過的人!

我最終為此做的工作如下:

  1. 一次讀取每個字符串
  2. 使用find函數查找我的定界符(在本例中為[:])
  3. 根據我的論據返回每個周長的位置(每對將保留年齡||名稱的開始和結束)
  4. 傳遞這些參數結果以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM