2010-01-11 93 views
0

我基本上試圖讓用戶通過 getline輸入十六進制輸入到字符串中,因爲我將對此執行其他操作。 (使用c + + .net的東西將無法正常工作)需要檢查輸入字符串中的十六進制值

我不想打破這個字符每說,然後通過字符串中的每個字符,看看它的範圍從[0-9]或[Aa -FF。相反,我想知道是否有任何人知道的更酷的功能或更好的方法來做到這一點。我知道strtoul函數,但它返回很長時間。這將迫使我然後我想它傳遞給一個流,使其重新成爲一個字符串。

另一件事情,我不確定是否需要擔心64位長與32位長。我正在開發一個使用英特爾處理器的linx盒子,但它可以用在處理器可能是64位的unix盒子上,我不確定。

所以我想這裏真的有兩個問題。任何幫助將是最受歡迎的

我可以得到一個答案: 你能評論我的第二個問題嗎?即使我現在不必擔心它...如果我使用32位系統長時間保存一個變量....會發生什麼變化(我想如此長的大小應該改變在64位處理器上)這對於保存在變量中的信息意味着什麼?其次爲了避免整個小/大端的東西,我把它保存在一個很長的思路中,因爲它是一個註冊類,它不會是一個移植問題。我錯了嗎?

感謝

+0

「更好」 以什麼方式? – 2010-01-11 19:58:40

+0

你想/你是否願意使用正則表達式庫,例如來自Boost或TR1? – 2010-01-11 20:54:57

+0

我不明白「強制[你] ......將它傳遞給一個流,使它重新成爲一個字符串」的一部分。如果你想堅持原始字符串,那就不要丟棄它。如果你關心64位值,那麼你可以使用'strtoull'。 – jamesdlin 2010-01-11 20:56:52

回答

2

檢查每個字符是唯一能夠完成的句點。

但是,您可能對isxdigit(int character)感興趣,如果傳遞的字符不是有效的十六進制字符(請注意x不作爲有效字符),則返回0。

你可以使用算法測試它是否是一行中的十六進制字符串,雖然它有點難看。如果你使用Boost,你可以使用boost :: bind來增加它。

通過此代碼段所需要的標頭是<區域設置>,<官能>,和<算法>。

bool is_hex_string(std::string& str) { 
    return std::count_if(str.begin(), str.end(), 
    std::not1(std::ptr_fun((int(*)(int))std::isxdigit))) > 0; 
} 
+0

我喜歡isxdigit函數。我做了快速功能啄 布爾inpChk(字符串inputString) { 對(INT I = 0; I djones2010 2010-01-11 20:54:09

+0

幾乎有nev呃只是一種在C++中做某事的方法。 – 2010-01-11 20:55:29

+0

int(*)(int)表示一個指向一個函數的指針,該函數接受一個int並返回一個int。 – kennytm 2010-01-11 20:56:11

0
int val; 
scanf("%x", &val); 

? (不會檢查整行是否有效。)

+0

這不會接近他所要求的。如果輸入爲0,它將失敗。如果給它一個部分十六進制字符串,它將返回有效部分,但不會提醒他其餘部分無效。 – 2010-01-11 20:42:07

+0

-1。這是一個甚至不回答這個問題的代碼片段(你在調用'scanf'後做了什麼?沒有檢查它匹配*什麼*),並且'scanf'很糟糕(人們應該更喜歡使用'sscanf' ,儘管由於dauphic提到的原因,這也是一個不好的解決方案)。 – jamesdlin 2010-01-11 21:01:08

+0

我明白這並不能完全解決問題,但批評變得荒謬。 (1)如果輸入爲0,則不會失敗。0是有效的十六進制數。 (2)喜歡在'scanf'上使用'sscanf'? 'sscanf'解析'char *','scanf'解析'stdin',你怎麼能比較兩者? – kennytm 2010-01-12 05:42:37

0

如果(的sscanf(字符串, 「%X」,& VAL)!= 1) //處理您的錯誤在這裏

相關問題