2012-03-22 92 views
-1

可能重複:
How to parse a string to an int in C++?如何識別一個字符串是否是一個數字,如果是,將其轉換爲一個int? (C++)

我有一個簡單的程序,這就是輸入經常是數字(猜謎遊戲差不多),但我需要的地方,如果增加一個選項用戶鍵入「幫助」或「/ h」或「?」該程序將顯示幫助菜單...

所以基本上我需要能夠區分,如果輸入的是一個字符串或數字,如果它的一個數字,將其轉換爲int ...

完成這件事的最好方法是什麼?我知道我可以使用atoi將字符串轉換爲int,但是如何檢查值是否爲數字?

謝謝!

編輯:根據我從你的答案中讀到的大多數人說,stringstream是最好的方式去...我做了一小段代碼,試圖瞭解如何stringstream工程,但我得到一些錯誤......任何想法爲什麼?

#include <iostream> 
#include <string> 

using namespace std; 

int str2int (const string &str) { 
    std::stringstream ss(str); 
    int num; 
    if((ss >> num).fail()) 
    { 
     num = 0; 
     return num; 
    } 
    return num; 
} 

int main(){ 
    int test; 
    int t = 0; 
    std::string input; 
    while (t !=1){ 
     std::cout << "input: "; 
     std::cin >> input; 
     test = str2int(input); 
     if(test == 0){ 
      std::cout << "Not a number..."; 
     }else 
      std::cout << test << "\n"; 
     std::cin >> t; 
    } 
    return 0; 
} 

錯誤:

Error C2079:'ss' uses undefined class std::basic_stringstream<_elem,_traits,_alloc>' 
Error C2228: left of '.fail' must have class/struct/union 
Error C2440: 'initializing': cannot convert 'const std::string' into 'int' 
+1

你在想什麼。以字符串輸入,檢查你的特殊情況,然後將其他東西轉換爲int – 2012-03-22 05:00:13

+0

@BrianRoach是的,我知道那是我需要做的......我需要將所有輸入轉換爲一個字符串,然後執行檢查,問題是如何做檢查? – 2012-03-22 05:03:37

+0

@GalAppelbaum - 輸入*是*字符串(文本)數據。 – 2012-03-22 05:07:26

回答

-1

只是檢查你的三個案例中,否則,如果任何字符不是一個數字,處理,否則轉換並繼續進行。

string input; 
cin >> input; 
if (input == "help" || input == "/h" or input == "?") 
    help(); 
else { 
    bool convertible = true; 
    for(string::size_type i = 0; i < input.size(); ++i) { 
     if (!isdigit((int)input[0])) { 
      convertible = false; 
      break; 
     } 
    } 
    if (convertible) { 
     int digit = atoi(input.c_str()); 
     // do guessing game stuff 
    } 
    else { 
     // handle 
    } 
} 
-1

如果沒有有效的轉換可以執行,atoi返回0.然後你可以處理它。

+0

如果實際輸入爲0,該怎麼辦? – 2012-03-22 05:04:15

+0

如果傳遞的數字是0,該怎麼辦?這是爲什麼stringstream是string-> int轉換更好的選擇的好理由。正如在重複鏈接中看到的,它可能不是最好的,但它確實有效。 – chris 2012-03-22 05:04:35

+0

這就是爲什麼你不使用'atoi'。至少使用'strtol',但這是C++,所以使用'stringstream'。 – 2012-03-22 05:18:01

0

使用strtol(http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/)而不是atoi。

long int strtol (const char * str, char ** endptr, int base); 

如果成功,您將得到一個非零值並且endptr已經移動。如果endptr沒有移動,你就知道這是一個失敗。如果失敗並且結束指針移動,則在結束ptr爲空格之前,您將得到一個0和內存地址。

相關問題