{
for(int i=0;i<strlen(argv[2]);i++)
if(isalpha(argv[2][i]))
{
cout<<"X"<<endl;
return (0);
}
}
我不想如果輸入的指數函數,如1E10 任何想法的這種運行時,如何有一個例外????使用因而isalpha
P.S試圖從非數字區分的數字,並希望1E10(以及類似)計算爲數字
{
for(int i=0;i<strlen(argv[2]);i++)
if(isalpha(argv[2][i]))
{
cout<<"X"<<endl;
return (0);
}
}
我不想如果輸入的指數函數,如1E10 任何想法的這種運行時,如何有一個例外????使用因而isalpha
P.S試圖從非數字區分的數字,並希望1E10(以及類似)計算爲數字
最簡單的方法是使用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;
}
isstringsrteam沒有工作 – 2013-04-10 06:52:40
有什麼辦法可以使它與isalpha – 2013-04-10 06:53:17
@AshFernando它是什麼方式沒有工作? – john 2013-04-10 06:53:19
如果輸入是正確的格式,然後執行轉換該第一測試。如果輸入無效,則會拋出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();
}
}
我想你需要解釋一下自己好一點。這聽起來像是你試圖將數字與非數字區分開來,並且你希望1e10(以及類似的數字)被算作數字嗎? – john 2013-04-10 06:19:41
是的,這正是我要求的 – 2013-04-10 06:21:52
現在你寫了「我不想讓它跑1e10」,並在下一行「count 1e10 as number」中給出幾個好的和壞的輸入例子。 – hansmaad 2013-04-10 06:27:18