这是一个使用stringstream的示例程序。目标是接受来自用户的行(标准输入)并在单独的行中打印每个单词。
int main()
{
std::istringstream currentline;
std::string eachword;
std::string line;
// Accept line from the standard input till EOF is reached
while ( std::getline(std::cin,line) )
{
currentline.str(line); // Convert the input to stringstream
while ( currentline >> eachword ) // Convert from the entire line to individual word
{
std::cout << eachword << std::endl;
}
currentline.clear();
}
return 0;
}
我想知道,有没有办法,我可以避免中间字符串变量(对象),行并直接将用户输入存储到当前行(istringstream对象)。
注意:
我知道,已有以下解决方案。
while ( std::cin >> eachword)
{
std::cout << eachword << std::endl;
}
答案 0 :(得分:1)
std::getline
需要一个字符串引用参数,这就是它放置它所获得的行的位置,所以当然你不能避免传递这样的参数(并且仍然使用该函数)。如果你经常需要它,你可以优雅地封装构造 - 例如:
bool getline(std::istream& i, std::istringstream& current)
{
std::string line;
if ( std::getline(i, line) ) {
current.str(line);
return true;
}
return false;
}
答案 1 :(得分:0)
如果您想简化第一个解决方案,
while ( currentline(line) >> eachword )
答案 2 :(得分:0)
我假设您不想使用中间对象来防止不必要的复制?
您可以通过显式设置流缓冲区缓冲区来实现相同的效果。
int main()
{
std::string line;
std::istringstream currentline;
std::string eachword;
// Accept line from the standard input till EOF is reached
while ( std::getline(std::cin,line) )
{
// Set the buffer without copying.
currentline.clear();
currentline.rdbuf()->pubsetbuf(&line[0], line.length() );
while ( currentline >> eachword )
{
std::cout << eachword << std::endl;
}
}
return 0;
}
由于破坏的顺序。您只需确保在用作缓冲区的对象之前销毁istringstream。所以你需要重新排列main()顶部的声明,以确保首先创建行,因此最后会被销毁(否则istringstream的析构函数有可能访问freeeded对象的内存)