测试流中没有更多非空格字符

时间:2013-04-26 11:57:14

标签: c++ debugging release iostream visual-studio-2010

假设我正在编写一个解释器,其中一个命令的格式为

define variable

其中变量可能只是一个小写的拉丁字母。

这就是我在做什么。确定命令是一个define命令后,我从字符串创建一个流,比如说"define a"(iss),然后从中读取命令名,断言它确实是“定义”。

std::istringstream iss(Command);
//read the word "define"
std::string cmdstr;
assert(iss >> cmdstr);
assert(cmdstr == DefineStr);

然后我从流中读取一个字符。阅读应该成功,所以我检查

if(!(iss >> var))
{
    errorMsg = "Invalid syntax of define command. Too few arguments\n";
    return false;
}

然后我必须检查流中没有更多的非空格字符,所以我检查

//the rest of the line must be empty;
if(iss >> var)
{
    errorMsg = "Invalid syntax of define command. Too many arguments\n";
    return false;
}

我的测试策略是,流 错误 中有更多字符?我知道我可以使用正则表达式,精神解析器等等来解决这个问题,但我想我希望坚持这种方法。问题是在调试模式(MSVC10.0)中,当我输入define a时,函数按预期工作,而在发布模式下,函数以某种方式进入if(iss >> var)并说Invalid syntax of define command. Too many arguments。我被卡住了,我无法理解什么是错的。

该功能的完整代码如下:

bool Interpreter::ExecuteDefineCommand(const std::string& Command, std::string& errorMsg)
{
    std::istringstream iss(Command);

    //read the word "define"
    std::string cmdstr;
    assert(iss >> cmdstr);
    assert(cmdstr == DefineStr);

    //read the variable name
    char var;
    if(!(iss >> var))
    {
        errorMsg = "Invalid syntax of define command. Too few arguments\n";
        return false;
    }
    if(!islower(var))
    {
        errorMsg = "You may define only lowercase variables\n";
        return false;
    }

    //the rest of the line must be empty;
    if(iss >> var)
    {
        errorMsg = "Invalid syntax of define command. Too many arguments\n";
        return false;
    }

    auto insertRes = variables.insert(std::make_pair(var, 0));

    if(!insertRes.second)
    {
        errorMsg = "The variable ";
        errorMsg += var;
        errorMsg += " has already been defined!\n";
        return false;
    }

    return true;
}

1 个答案:

答案 0 :(得分:0)

问题在于:

std::string cmdstr;
assert(iss >> cmdstr);
assert(cmdstr == DefineStr);

因为运营商>>在assert内部,它只是不会在Release模式下执行!正确的方法是

std::string cmdstr;
iss >> cmdstr;
assert(iss);
assert(cmdstr == DefineStr);