2013-04-10 50 views
0
{ 
    for(int i=0;i<strlen(argv[2]);i++) 
    if(isalpha(argv[2][i])) 
    { 
    cout<<"X"<<endl; 
    return (0); 
    } 
} 

我不想如果輸入的指數函數,如1E10 任何想法的這種運行時,如何有一個例外????使用因而isalpha

P.S試圖從非數字區分的數字,並希望1E10(以及類似)計算爲數字

+1

我想你需要解釋一下自己好一點。這聽起來像是你試圖將數字與非數字區分開來,並且你希望1e10(以及類似的數字)被算作數字嗎? – john 2013-04-10 06:19:41

+0

是的,這正是我要求的 – 2013-04-10 06:21:52

+1

現在你寫了「我不想讓它跑1e10」,並在下一行「count 1e10 as number」中給出幾個好的和壞的輸入例子。 – hansmaad 2013-04-10 06:27:18

回答

2

最簡單的方法是使用C++的內置數字解析。將argv[2]放入istringstream,然後嘗試將其讀回爲double

#include <sstream> 
#include <iostream> 
using namespace std; 

int main(int argc, char** argv) 
{ 
    istreamstream buf(argv[2]); 
    double x; 
    if (buf >> x) 
    { 
     cout << "argv[2] is a number and it's value is " << x << "\n"; 
    } 
    else 
    { 
     cout << "argv[2] is not a number\n"; 
    } 
} 

希望這會有所幫助。

編輯

由於上述不完全正確(即它是錯的),這裏的另一個版本,是希望更多的像OP期待什麼。函數is_a_number將對任何形式爲正常浮點數的字符串(例如, 「1E10」,「1.2」,「 - 3」,「1.2E-10」等等

#include <iostream> 
using namespace std; 

static bool is_a_number(const char* str); 

int main() 
{ 
    if (is_a_number(argv[2])) 
    { 
     cout << "its a number\n"; 
    } 
    else 
    { 
     cout << "not a number\n"; 
    } 
} 

static bool is_a_number(const char* str) 
{ 
    bool mant_digits = false, exp_digits = true; 
    if (*str == '-' || *str == '+') 
     ++str; 
    while (isdigit((unsigned char)*str)) 
    { 
     mant_digits = true; 
     ++str; 
    } 
    if (*str == '.') 
    { 
     ++str; 
     while (isdigit((unsigned char)*str)) 
     { 
      mant_digits = true; 
      ++str; 
     } 
    } 
    if (*str == 'e' || *str == 'E') 
    { 
     ++str; 
     if (*str == '-' || *str == '+') 
      ++str; 
     exp_digits = false; 
     while (isdigit((unsigned char)*str)) 
     { 
      exp_digits = true; 
      ++str; 
     } 
    } 
    return *str == '\0' && mant_digits && exp_digits; 
} 
+0

isstringsrteam沒有工作 – 2013-04-10 06:52:40

+0

有什麼辦法可以使它與isalpha – 2013-04-10 06:53:17

+0

@AshFernando它是什麼方式沒有工作? – john 2013-04-10 06:53:19

0

如果輸入是正確的格式,然後執行轉換該第一測試。如果輸入無效,則會拋出std::runtime_error異常。

class CommandLine 
{ 
public: 
    CommandLine(int argc, char*argv[]) : 
     locale(""), arguments(argv, argv+ argc) 
    { 
     if (argc < 3) 
      throw std::runtime_error("not enough arguments."); 
    } 

    double GetValueXYZ() 
    { 
     if (!IsValidInput(arguments[2])) 
      throw std::runtime_error(
       arguments[2] + " is invalid input for XYZ."); 
     return std::strtod(arguments[2].c_str(), nullptr); 
     // You could use a stringstream instead 
    } 

private: 
    bool IsValidInput(const std::string& arg) 
    { 
     const auto& numpunct = std::use_facet<std::numpunct<char>>(locale); 
     auto err = std::find_if(begin(arg), end(arg), [&](char c) 
     { 
      return !(std::isdigit(c, locale) || 
       c == numpunct.thousands_sep() || 
       c == numpunct.decimal_point()); 
     }); 
     return err == end(arg); 
    } 

    std::locale locale; 
    std::vector<std::string> arguments; 
}; 


int main() 
{ 
    char*argv[] = { "main", "2.34" , "1.10"}; 
    try 
    { 
     CommandLine cmd(3, argv); 
     std::cout << cmd.GetValueXYZ(); 
    } 
    catch(std::runtime_error& e) 
    { 
     std::cout << e.what(); 
    } 
} 
相關問題