1

私はどこを見ても、この特定の質問に対する答えを見つけることができません:(

すべての特殊文字が取り除かれた日付を含む文字列の日付があります。(例: yyyymmddhhmm または 201212031204)。

後でソートできるように、この文字列を int に変換しようとしています。関数に対して値が高すぎるため、atoi を試しましたが、機能しませんでした。ストリームを試しましたが、常に -858993460 が返されます。これは、文字列が大きすぎるためだと思われます。私は atol と toll を試しましたが、まだ正しい答えが得られません。

これは宿題なので、boost は使用したくありません。許可されるとは思いません。

大きな文字列を int に変換するオプションがありませんか? ありがとうございました!

私ができるようにしたいこと:

int dateToInt(string date)
{
date = date.substr(6,4) + date.substr(3,2) + date.substr(0,2) + date.substr(11,2) + date.substr(14,2);
int d;
d = atoi(date.c_str());
return d;

}
4

3 に答える 3

5

201212031204大きすぎて収まらないため、負の数 になりintます。long longの使用を検討してください

ところで、文字列も並べ替えることができます。

于 2012-12-03T17:13:47.090 に答える
2

値が大きすぎるという正しい方向に進んでいますが、それはこれらの関数だけではありません。一般人には大きすぎるintints は最大 32 ビット、または最大値 2147483647 (符号なしの場合は 4294967295) のみを保持します。Along longは、使用している数値に対して十分な大きさであることが保証されています。たまたま 64 ビット システムを使用している場合は、alongも同様です。

これらのより大きな整数のいずれかを使用すると、ストリームは適切に変換されるはずです。または、関数を使用してそれを実行する場合は、atollfor along longまたはatolfor a を参照してくださいlongstrtoll(ただし、エラー チェックを改善するには、 orを検討する必要がありますstrtol。)

完全に代わりに、を使用することもできますtime_t。これらは内部で整数型であるため、比較して並べ替えることができます。そして、それらのための素晴らしい関数がいくつかあります ( http://www.cplusplus.com/reference/ctime/<ctime>を見てください)。

于 2012-12-03T17:22:41.533 に答える
0
typedef long long S64;

S64 dateToInt(char * s) {
    S64 retval = 0;
    while (*s) {
         retval = retval * 10 + (*s - '0');
         ++s;
    }
    return retval;
}

すでに述べたように、使用している数値は 32 ビットに収まらないことに注意してください。

于 2012-12-03T21:17:26.233 に答える