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 によって返された文字列に対してではなく、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

stringstream だけが必要で、他には何も必要ありません。残りはすべて純粋なオーバーヘッドです。

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 に答える