2014-01-16 58 views
12

this question接受的答案笔者不建议投入运营的使用,这是因为:为什么要在C++中避免输入操作符(操作符>>)?

operator>>iomanip流操纵等“有趣”的东西, 所以你永远不能肯定它做什么广告。

但这是什么意思?当我们用C++编程时,为什么我们应该避免使用C++的输入操作符?

我从The Definitive C++ Book Guide and List读到的书没有提到这个,他们介绍和使用了输入操作符。我在互联网上没有发现任何有用的主题。

谢谢!

p.s:很抱歉,但我没有足够的声望在该主题中提出我的问题。

+2

好吧,就我自己多年来没有遇到过的问题而言,没有问题。这个答案的作者所暗示的(可能是经验)是它从文件输入值时“可能/可能”导致意外的结果。但在我看来,情况并非如此,所以你可以按照你的意愿使用它。 –

+0

我在答案中没有看到任何警告。你能发表评论或帖子上的确切链接吗?也许接受的答案变了? – Mikhail

+0

@Mikhail它来自另一个回答评论http://stackoverflow.com/a/21099735/498298 – hansmaad

回答

-4

如果用户输入长度大于分配的缓冲区,则可能导致缓冲区溢出。 黑客可能会使用它来覆盖返回地址并运行恶意代码。

+0

您能否在输入运算符的上下文中解释这一点? –

+0

如果你将输入指向'char str [80]',那么黑客可能会在该字符串的开头写入恶意代码(程序集),并且在位置80,他将把相对地址设为-80,所以当你的函数存在它会运行他的代码。 –

+0

@DieterLücking - 为什么它不相关?他想知道为什么不推荐使用输入操作符。 –

3

我能想到的唯一的事情是操作员>>在使用之间保留了很多设置。例如:

std::ifstream fin("input.txt"); 
std::string str; 
double num; 

someOtherFunction(fin); 

while (fin >> str >> num) 
{ 
    //do something 
} 

看起来很无辜的,除非我们认为:

void someOtherFunction(std::ifstream& fin){ 
    fin.width(1); 
    fin.setf(/* some flags here */); 
    //... 
} 

我个人读取文件的原始和不使用正则表达式解析,但我绝不是在这方面的专家,这样的建议应该带着一大粒盐。

+0

我明白了,这是一个很好的例子。不过,我认为问题更可能是输入流而不是输入运算符。我在问题中提到的书籍推荐设计每个使用流的函数,以便在函数的开头存储流的状态,更改适合该任务的状态,然后将流的状态重置为函数的结束。 –