所以这个用户输入所有的一行字符串,我需要将输入解析为两个类别:用户年龄和用户名。 例如,用户输入 - >> [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和解析函数。 谢谢。
答案 0 :(得分:0)
读入令牌,就像你正在使用cin一样
使用while循环测试[]
对于循环内部,这里有一些事情可以帮助你:
std::string
&#39; front
和back
函数非常适合确保输入以[结尾] std::string
&#39; substr
函数非常适合修剪[],因此您可以轻松忽略它们以进行其余的解析std::stringstream
允许您调用make一个仅包含剪裁输入的流。std::getline(stream, string, char)
将读取它找到的char
参数或流末尾的所有字符,并将结果填入字符串参数中,然后丢弃它找到的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
}
答案 1 :(得分:0)
好的,非常感谢帮助或至少试图帮助的人!!
我最终为这部分做的事情如下:
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;
}
}
希望这将有助于其他人在未来有同样的问题!!