2012-10-03 65 views
1

我需要識別包含在一個字符串中的數字的類型(整數或浮點數)。詳細地說,我需要了解可以存儲號碼的最小類型。我希望無符號類型更適合正值。也許更容易一些例子來解釋:如何識別包含在C中的字符串中的數字的類型?

"123" -> unsigned char 

"-21" -> char 

"257" -> unsigned short 

"-271"-> short 

... 

"....." long long 

"1.2" float 

"....." double 

"a"  NaN/error 

我考慮使用strtoul將,與strtol,strtod轉換,我不知道是否有一個函數(像is_char(),is_float(),...或num_type ())或某些「智能」(基於數學的......),以便在開始編碼之前進行簡單的識別。

謝謝。

+1

'limits.h'提供的'定義* _MIN'和'* _MAX'(即'INT_MIN')爲整數類型,這可能會派上用場選擇一個合適的變量。 – AusCBloke

回答

2

我會從測試否定開始。然後我會尋找一個小數點(和指數符號)來確定是否使用整數。

對於整數,將數字轉換爲最大的有符號或無符號值(大概是int64),然後轉換回字符串並測試數字是否相同(否則無法用int表示)。

此時,您可以使用位移或位掩碼來檢查尺寸要求。實際上,您希望獲取絕對值(在簽名類型的情況下)並檢查左邊的零。我將展示無符號的基本思想......

unsigned long long val; 
// ... 

if(0 != (val >> 32)) 
    printf("unsigned long long\n"); 
else if(0 != (val >> 48)) 
    printf("unsigned long\n"); 
else if(0 != (val >> 56)) 
    printf("unsigned short\n"); 
else 
    printf("unsigned char\n"); 

對於浮點,你可能想讀值作爲對FLT_MAX,DBL_MAX等double,然後測試...

+0

簡單...和很好:)我自己正在考慮更多的正則表達式的東西,但這將做的工作:) – user210504

1

您提首選較小的尺寸,無符號的第二。但是你的類型是否存在一致的「啄食順序」?我的意思是說:是否有一些字符串S1可以在技術上轉換爲X型或Y型,並選擇X,但某些字符串S2也可以轉換爲X型或Y型,但選擇Y?您可能想知道"lexical casting"。如果你確實有一個你感興趣的類型的啄食順序,你可以按順序嘗試它們,並且繼續捕捉異常,直到其中一個正常工作...: - /或者寫下你自己的等價物。

但是,除此之外,C++的編譯特性是這樣的,當你得到運行時並且有一個輸入字符串時,像auto這樣的技巧不可用。此外,汽車不會遵循你的想法,因爲它決定「1」的類型是int

如果您想解決您自己的方法,您已被指向limits.h。但是,如果你有興趣的慣用C++爲,然後檢查了一篇文章我關於這個問題寫道:

http://hostilefork.com/2009/03/31/modern_cpp_or_modern_art/

+0

關於你的第一段,OP表示,他們首選'unsigned'非負類型,並給'123'的例子被視爲'unsigned char'。 – paddy

+0

@paddy錯過了那個註釋(或者在去尋找鏈接之後忘了它在那裏)......但是更一般的觀察是轉換計劃中可能會有一些總的順序。我會問有關該屬性,而不是... – HostileFork

相關問題