我知道每个人都厌倦了被问到如何解析字符串,但这是不同的。我试图在C ++中为绘图程序创建一个命令行界面。我以前能够解析行,但我的问题是有多个命令具有不同的参数量。
这是我最后一次尝试命令行功能(暂时忽略标志):
try
{
Session["UID"] = Lgn.EmpLogin(TxtUN.Text, TxtPW.Text);
int? UID = Convert.ToInt32(Session["UID"].ToString());
DataTable dt = new DataTable();
dt = Lgn.EmpLoginbyId(Convert.ToInt32(UID));
string Username = dt.Rows[0]["UserName"].ToString();
//string Username = dt.Rows[0]["UserName"].ToString();
Session["ETID"] = Convert.ToInt32(dt.Rows[0]["UserTypeID"].ToString());
if (Username == null)
{
Session["UserName"] = Username.ToString();
}
if (UID.HasValue)
{
Response.Redirect("Admin.aspx");
}
}
catch { }
}
当我输入一个命令时,它只是冻结了一个空白行,我必须按ctrl + c。有什么想法吗?
答案:Evan Teran的方法适用于此链接:Split a string in C++?答案 0 :(得分:3)
问题在于:
while(pos == string::npos){
v.push_back(line.substr(i, pos-i));
i = ++pos;
pos = line.find(space, pos);
if (pos != string::npos)
v.push_back(line.substr(i, line.length()));
如果找不到空格,则返回的值为npos
,然后再循环一次。但是由于你的行尾没有空间,它会无限期地继续:无限循环,内存增加,因为文档说明
如果此(pos)大于字符串长度,则该函数永远不会找到匹配项
总结一下:
pos == string::npos
,则进入循环并获得无限循环,如上所述pos
不是string::npos
且您的向量为空=>段错误。我建议您查看更好的方法来分割字符串,如here
但与此同时我修复了你的循环并且现在工作正常(而且它也更简单):
auto i = line.find_first_not_of(space);
for(;;){
auto pos = line.find(space,i);
// store token
v.push_back(line.substr(i,pos-i));
// no more space: bail out
if (pos==string::npos)
{
break;
}
// move to next non-space
i = line.find_first_not_of(space,pos+1);
// protection against trailing spaces
if (i==string::npos)
{
break;
}
}
string::npos
,以便substr
提取整个字符串,然后循环停止。