string whatTime(int seconds) {
string h,m,s,ans;
stringstream ss;
ss << (seconds/3600);
seconds -= (3600*(seconds/3600));
ss >> h;
ss.str("");
ss << (seconds/60);
seconds -= (60*(seconds/60));
ss >> m;
ss.str("");
ss << seconds;
ss >> s;
return (h + ":" + m + ":" + s );
}
上述程序的输出格式为“some_value ::” 我也尝试过ss.str(std :: string())和ss.str()。clear(),但即使这样也行不通。 有人可以建议如何解决这个问题吗?
答案 0 :(得分:11)
你correctly用ss.str("")
清空了字符串缓冲区,但是你还需要用ss.clear()
清除流的错误状态,否则在第一次提取后不会再尝试进一步的读取,这导致了EOF条件。
所以:
string whatTime(int seconds) {
string h,m,s,ans;
stringstream ss;
ss << (seconds/3600);
seconds -= (3600*(seconds/3600));
ss >> h;
ss.str("");
ss.clear();
ss << (seconds/60);
seconds -= (60*(seconds/60));
ss >> m;
ss.str("");
ss.clear();
ss << seconds;
ss >> s;
return (h + ":" + m + ":" + s );
}
但是,如果这是您的完整代码,并且您出于任何原因不需要单个变量,我会这样做:
std::string whatTime(const int seconds_n)
{
std::stringstream ss;
const int hours = seconds_n / 3600;
const int minutes = (seconds_n / 60) % 60;
const int seconds = seconds_n % 60;
ss << std::setfill('0');
ss << std::setw(2) << hours << ':'
<< std::setw(2) << minutes << ':'
<< std::setw(2) << seconds;
return ss.str();
}
这简单得多。 See it working here
在使用std::to_string
的C ++ 11 you can avoid the stream altogether中,但这不允许你进行零填充。
答案 1 :(得分:2)
您需要调用stringstream的clear方法,而不是使用ss.clear()
调用stringstream返回的字符串。
string whatTime(int seconds) {
string h,m,s,ans;
stringstream ss;
ss << (seconds/3600);
seconds -= (3600*(seconds/3600));
ss >> h;
ss.str("");
ss.clear();
ss << (seconds/60);
seconds -= (60*(seconds/60));
ss >> m;
ss.str("");
ss.clear();
ss << seconds;
ss >> s;
return (h + ":" + m + ":" + s );
}
答案 2 :(得分:0)
你只需要字符串流,没有别的。其余的都是纯粹的开销。
string whatTime(int seconds) {
stringstream ss;
ss << setFill('0');
ss << setw(2) << (seconds/3600) << ":" // hours
<< setw(2) << ((seconds / 60) % 60) << ":" // minutes
<< setw(2) << (seconds%60); // seconds
return ss.str();
}