正如标题所说,我在C ++中进行输入验证(在这种情况下,对于int)。我使用stringstream对象从用户获取,使用stringstream通过stream运算符分配给变量,如下所示:
if (sStream >> validInteger) {
if ((sStream >> input)) {
code code code
}
}
所以在第一个if语句中,我获取了我创建的stringstream对象,并将其置于整数类型中。如果我使用stringstream将char放入该整数类型,则该语句将返回false,并且它实际上不会分配给整数,正如在这种情况下所预期的那样。
我知道如果你尝试使用赋值运算符将一个char文字赋值给一个int,它只会转换为该char的ASCII int值(比如int charInt =' c'工作正常,分配ASCII值)
所以这意味着sStream中内置了逻辑>> validInteger语句不转换数据类型,返回false并且实际上没有将数据分配给该变量。
我的问题是关于这个陈述的逻辑。这个逻辑在哪里内置?逻辑是否返回false而不是在流操作符(>>)或stringstream对象中分配?
我已经使用iostream和cstream对象(如cin和ifstream)对此进行了测试,并且它们的执行方式相同。但这个逻辑是否也构建在cin和fstream中?或者它只是在流操作符(>>)?
我的代码功能正常,一切都按预期工作,我只是想澄清一下C ++运算符/对象在这种情况下如何实际工作以供我自己使用。
答案 0 :(得分:0)
操作:
sStream >> validInteger
返回流对象,不是true,false或者是一些错误。可以通过void *
的运算符重载将流对象的状态(或iostream库中的任何其他流对象类型)转换为可以使用if()或其他条件构造进行测试的内容。早期版本的C ++中的转换,以及最新版本中的bool
转换。
答案 1 :(得分:0)
详细说明,您可以随时查看cppreference。在stringstream
的顶部,您可以看到继承树,并与其他输入流进行比较以查看第一个共享祖先。然后,看看它:
(1)算术类型
从流中按顺序提取和解析字符,将它们解释为正确类型值的表示, 它被存储为val的值。 在内部,该函数首先构造一个sentry对象(noskipws设置为false)来访问输入序列。然后(如果 好的,它调用num_get :: get(使用流的选定语言环境)来 执行提取和解析操作,调整 因此流的内部状态标志。最后,它摧毁了 返回前的哨兵对象。
引以为傲的。实施了适当的类型检查。