split string - 多个分隔符C ++

时间:2015-06-05 23:10:41

标签: c++ string

所以这个用户输入所有的一行字符串,我需要将输入解析为两个类别:用户年龄和用户名。 例如,用户输入 - >> [23:弗兰克] [15:杰克] [45:] [33:索菲亚] [] 在这种情况下,我有多个参数(分隔符,总共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和解析函数。 谢谢。

2 个答案:

答案 0 :(得分:0)

读入令牌,就像你正在使用cin一样

使用while循环测试[]

对于循环内部,这里有一些事情可以帮助你:

  1. std::string&#39; frontback函数非常适合确保输入以[结尾]
  2. 开头
  3. std::string&#39; substr函数非常适合修剪[],因此您可以轻松忽略它们以进行其余的解析
  4. std::stringstream允许您调用make一个仅包含剪裁输入的流。
  5. std::getline(stream, string, char)将读取它找到的char参数或流末尾的所有字符,并将结果填入字符串参数中,然后丢弃它找到的char,这样您就可以了不会因为解析剩下的输入而绊倒。
  6. strtoul会将字符串转换为数字并告诉您它是否失败。它不接受负数,因此你可以抓住试图欺骗你的程序的人。
  7. getline(stream, string)将读取流,直到它到达行结束标记。非常适合读取不包含任何行尾的流的其余部分。
  8. 使用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 :(得分:0)

好的,非常感谢帮助或至少试图帮助的人!!

我最终为这部分做的事情如下:

  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;
        }
     }
    
  5. 希望这将有助于其他人在未来有同样的问题!!