Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 拆分字符串-多个分隔符C++;_C++_String - Fatal编程技术网

C++ 拆分字符串-多个分隔符C++;

C++ 拆分字符串-多个分隔符C++;,c++,string,C++,String,所以这个用户输入都在一行字符串中,我需要将输入分为两类:用户年龄和用户名。 例如,用户输入-->>[23:Frank][15:Jack][45:[33:sofia][] 在本例中,我有多个参数(分隔符,总共3个)是[:],此外,我需要获得用户输入并在最后遇到[]时停止循环 我是这么想的: string input; vector<string> age; vector<string> name; cin >> input; while (input != "

所以这个用户输入都在一行字符串中,我需要将输入分为两类:用户年龄和用户名。 例如,用户输入-->>[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
    ................
}
字符串输入;
媒介年龄;
载体名称;
cin>>输入;
而(输入!=“[]”)
{
年龄介于第一次[到:
分配给年龄变量
获取介于以下之间的名称:]
分配给用户名变量
................
}
另外-如果其中一个括号缺少名称,如何分配一个空白名称并跳过该部分以处理其余部分(意味着我将输出旁边没有名称的年龄)。 关于如何获取和处理数据的任何建议。 我看到了一些先进的东西,比如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;
        }
     }
    
    while(true)
    {
    字符串myInput;
    cin>>myInput;
    而(myInput!=“[]”)
    {
    int age_beg=myInput.find('[')+1;
    int age_end=myInput.find(“:”,age_beg);
    字符串age=myInput.substr(age_beg,(age_end-age_beg));
    int name_beg=年龄_end+1;
    int name_end=myInput.find(']',name_beg);
    string name=myInput.substr(name_beg,(name_end-name_beg));
    
    我不会帮你做家庭作业,但我会一次读一个字符,然后构建一个状态机,状态为等待[,解析年龄直到冒号,解析名称直到],等待[。。。