>>在溪流中留下辛博斯特吗?

Does >> leave simbolst in the stream?

本文关键字:gt      更新时间:2023-10-16

我在下面写的代码计算给定数字的位数总和,直到总和>10。因此,问题是:运算符">>"从流中提取信息并使流为空?如果是,那么为什么在我将EOF的位重置为0之后,我不能执行"ss<<sum"呢?

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;

使用整数不是比使用字符串更能解决问题吗?类似:

#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;
}

如果你试图在每次迭代中重置流,这可能会达到你想要的效果:

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("")执行了此操作)。

相关文章:
  • 没有找到相关文章