是>>在流中离开simbolst?

时间:2014-04-24 19:50:13

标签: c++ stream operator-keyword stringstream

我在下面写的代码表示给定数字所包含的数字之和,直到sum> 10.因此,问题是:运营商">>"从流中提取信息并使流空?如果是的话,为什么我不能做到" ss<<总和"我将EOF位重置为0后?

int sum = 0;
stringstream ss("13245");
char ch;
while (1)
{
    while (ss >> ch)
    {
        sum += ch - '0';
    }
    ss.clear();
    ss << sum; //can't perfom
    if (sum<10 ) break;
             sum=0;


}
cout << sum;

2 个答案:

答案 0 :(得分:1)

使用整数比使用字符串更难解决问题吗?像:

#include <iostream>

template<typename SomeIntegralT>
SomeIntegralT sum_digits(SomeIntegralT n) {
    do {
        SomeIntegralT sum = 0;
        while( n ) {
            sum += n % 10;
            n /= 10;
        }
        n = sum;
    } while( n > 9 );
    return n;
}

int main()
{
    std::cout << sum_digits(124343525ul) << std::endl;
    std::cout << sum_digits(9999) << std::endl;
    std::cout << sum_digits(12345) << std::endl;
}

答案 1 :(得分:0)

如果您尝试在每次迭代时重置流,则可能会执行您所寻求的操作:

int sum = 0;
stringstream ss("13245");

while (1)
{
    int c;
    while ((c = ss.get()) != EOF)
        sum += c - '0';

    ss.clear(); // clear stream state
    ss.str(""); // clear buffer
    ss << sum;  // write new data

    if (sum<10 )
        break;

    sum=0;
}
cout << sum;

<强>输出

6

注意:我冒昧地使用get()成员,因为它似乎更适合您要完成的任务。使用9999辅助样本进行测试也会产生预期的9结果。要回答你的问题,是的,字符串缓冲区不会被清除,除非清除它(我们在上面使用str("")执行)。