2012-12-03 477 views
1

我到處找,找不到回答這個具體問題:(將字符串轉換爲int(C++)

我有一個字符串日期,其中包含與剝奪所有的特殊字符的日期。(即:yyyymmddhhmm或201212031204)

我試圖將這個字符串轉換爲一個int以便能夠稍後對它們進行排序我嘗試過atoi,沒有工作,因爲函數的值太高我嘗試了流,但它總是返回-858993460,我懷疑這是因爲這個字符串太大了。我嘗試過atol和atoll,但他們仍然沒有給出正確答案。

我寧願不使用助推,因爲這是作業,我不認爲我會被允許。

我沒有選項將大字符串轉換爲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; 

} 
+3

如果您只需要對它們進行排序,請將它們排序爲字符串。 – mah

+2

爲什麼不在日期/時間結構中返回它?沒有辦法在int中存儲那麼多數字,所以需要一些更大的數據類型;使用與系統時間函數相同的格式似乎是合適的('date_t' iirc) – ssube

+0

您是否有任何可用的64位可變數據類型?您的結果數量超過了20億,這對於32位整數來說太大了。無符號32位整數的最大值是4,294,967,295。 –

回答

2

你說得對,價值太大了,但不僅僅是這些功能。一般來說,這對於int來說太大了。 int只能保持32位,或最大值2147483647(如果無符號,則爲4294967295)。 A long long保證足夠大的數字,你正在使用。如果你碰巧在64位系統上,long也是。

現在,如果您使用其中一個較大的整數,流應該正確轉換。或者,如果您想使用某項功能,請致電atoll查看long longatollong。 (儘管爲了更好的錯誤檢查,你應該考慮strtollstrtol。)

完全或者,你也可以使用time_t。它們是引擎蓋下的整數類型,因此您可以對它們進行比較和排序。在<ctime>中有一些很好的功能(看看http://www.cplusplus.com/reference/ctime/)。

+0

謝謝,我會研究time_t或製作我自己的時間結構! – XuoriG

+0

也可以在cstdlib中定義compare(void *,void *)並使用sort(a,compare)avalible –

5

你得到負數,因爲201212031204是太大,無法int。考慮使用long long s

順便說一句,您也可以對字符串進行排序。

0
typedef long long S64; 

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

請注意,如前所述,您使用的數字將不適合32位。

+1

您需要增加s。循環永遠不會結束 – Dominick

+0

糟糕。爲讀者鍛鍊;-) –