用C ++解析一行

时间:2016-11-12 20:14:25

标签: c++ parsing

我知道每个人都厌倦了被问到如何解析字符串,但这是不同的。我试图在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++?

1 个答案:

答案 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提取整个字符串,然后循环停止。
  • 如果找到空格,则返回索引,跳至第一个非空格并查找下一个字段。
  • 如果以空格开头或/和结尾,也不会崩溃:)