我在下面写的代码表示给定数字所包含的数字之和,直到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;
答案 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("")
执行)。