2013-12-17 44 views
1

這個小練習是爲了從用戶那裏得到一個可以是十進制,十六進制或八進制的字符串。首先,我需要確定字符串是哪一種編號。第二個我需要轉換,這個數字爲int,並在其適當的格式顯示數字,例如:檢查十六進制前綴後,將字符串轉換爲int的更乾淨的方法是什麼?

cout <<(dec,hex,oct, etc)<< number; 

這是我想出了。我想要一個更簡單,更清潔的方式來寫這個。

string number = ""; 
cin >> number; 
string prefix = "dec"; 
char zero = '0'; 
char hex_prefix = 'x'; 
string temp = ""; 
int value = 0; 

for(int i =0; i<number.size();++i) 
{ 
    if(number[0] == zero)//must be octal or hex 
    { 
     if (number[0] == zero && number[1] == hex_prefix) //is hex 
     { 
      prefix = "hex"; 
      for(int i = 0; i < (number.size() - 2); ++i) 
      { 
       temp[i] = number[i+2]; 

      } 
      value = atoi(temp.c_str()); 
     } 
     //... code continues to deal with octal and decimal 
+0

我沒有看到1st for循環的必要性。 – faisal

+0

我建議發佈什麼輸入字符串看起來像所以我們給你一個更好的答案。 –

回答

2

您正在檢查number[0]兩次,這是第一個最明顯的問題。

if已經檢查number[0]number[1],我沒有看到外面的一個點。

最外面的循環也很難理解,你期望數字之前的非十六進制數據,還是什麼?您的問題可能會更清晰地顯示預期的輸入字符串的外觀。

我認爲最乾淨的就是忽略這一點,並將其推入現有的(庫)代碼中,這些代碼可以解析任何基礎中的整數。在C中,我會推薦strtoul(),你當然也可以在C++中使用它。

+2

根據需要,如果您爲'base'參數指定了零,則可以使用strtol()或strtoul()對您進行檢查。 – Medinoc

0

你有兩個內部循環具有相同的值整數這可能是你的代碼中的衝突問題。我建議你看看在C++庫中的isdigitislower方法,並利用這些方法來完成你的任務。 isdigit &​​

好運

0

這是打印數量刪除十六進制前綴之後,否則返回0:

#include<iostream> 
#include<cmath> 
#include<stdlib.h> 
using namespace std; 
int main(){ 
     string number = ""; 
     cin >> number; 
     string prefix = "dec"; 
     char zero = '0'; 
     char hex_prefix = 'x'; 
     string temp = ""; 
     int value = 0; 
     if (number.size()>=2 && number[0] == zero && number[1] == hex_prefix) //is hex 
     { 
      prefix = "hex"; 
      for(int i = 0; i < (number.size() - 2); ++i) 
      { 
       temp[i] = number[i+2]; 

      } 

      value = atoi(temp.c_str()); 
     } 
     cout<<value; 
     return 0; 
} 
0

這是我發現的部分解決方案是儘可能的乾淨,但它不不報告整數的格式:

int string_to_int(std::string str) 
{ 
    std::istringstream stream; 
    stream.unsetf(std::ios_base::dec); 
    int result; 
    if (stream >> result) 
     return result; 
    else 
     throw std::runtime_error("blah"); 
} 

... 

cout << string_to_int("55") << '\n'; // prints 55 
cout << string_to_int("0x37") << '\n'; // prints 55 

這裏的要點是stream.unsetf(std::ios_base::dec) - 它取消默認設置的「十進制」標誌。這個格式標誌告訴iostreams期望一個十進制整數。如果沒有設置,iostream會期望任何基地的整數。

相關問題