C++ 拆分字符串-多个分隔符C++;
所以这个用户输入都在一行字符串中,我需要将输入分为两类:用户年龄和用户名。 例如,用户输入-->>[23:Frank][15:Jack][45:[33:sofia][] 在本例中,我有多个参数(分隔符,总共3个)是[:],此外,我需要获得用户输入并在最后遇到[]时停止循环 我是这么想的: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 != "
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)
将读取流,直到它到达行尾标记。非常适合读取不包含行尾的流的其余部分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));
我不会帮你做家庭作业,但我会一次读一个字符,然后构建一个状态机,状态为等待[,解析年龄直到冒号,解析名称直到],等待[。。。