5
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() 但即使这样也不起作用。有人可以建议任何方法来解决这个问题吗?

4

3 回答 3

13

您已经使用正确清空了字符串缓冲区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();
}

这要简单得多。看到它在这里工作

在 C++11中,您可以使用完全避免流std::to_string,但这不允许您进行零填充。

于 2012-12-15T12:00:02.943 回答
2

您需要调用 stringstream 的 clear 方法,而不是使用ss.clear().

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 );

}
于 2012-12-15T11:49:44.723 回答
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();
}
于 2012-12-15T12:17:29.793 回答