Bre*_*ein 117 c++ visual-c++
我在编写一个检查字符串是否为数字的函数时遇到了很多麻烦.对于我正在编写的游戏,我只需要检查我正在阅读的文件中的一行是否是一个数字(我会知道这是一个参数).我编写了以下功能,我相信它工作顺利(或者我不小心编辑了以阻止它,或者我是精神分裂症或Windows是精神分裂症):
bool isParam (string line)
{
if (isdigit(atoi(line.c_str())))
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
Cha*_*via 128
最有效的方法是迭代字符串,直到找到一个非数字字符.如果有任何非数字字符,您可以认为该字符串不是数字.
bool is_number(const std::string& s)
{
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
return !s.empty() && it == s.end();
}
Run Code Online (Sandbox Code Playgroud)
或者如果你想用C++ 11方式做到这一点:
bool is_number(const std::string& s)
{
return !s.empty() && std::find_if(s.begin(),
s.end(), [](char c) { return !std::isdigit(c); }) == s.end();
}
Run Code Online (Sandbox Code Playgroud)
正如下面的评论中所指出的,这仅适用于正整数.如果您需要检测负整数或分数,则应该使用更强大的基于库的解决方案.虽然,添加对负整数的支持是非常微不足道的.
Ben*_*igt 76
为什么重新发明轮子?C标准库(也可以在C++中使用)有一个函数可以完成这个:
char* p;
long converted = strtol(s, &p, 10);
if (*p) {
// conversion failed because the input wasn't a number
}
else {
// use converted
}
Run Code Online (Sandbox Code Playgroud)
如果你想处理分数或科学记数法,请strtod改为(你会得到一个double结果).
如果要在C/C++ style("0xABC")中允许十六进制和八进制常量,则0改为生成最后一个参数.
然后你的功能可以写成
bool isParam(string line)
{
char* p;
strtol(line.c_str(), &p, 10);
return *p == 0;
}
Run Code Online (Sandbox Code Playgroud)
Edw*_*nge 27
您可以使用boost :: lexical_cast以C++方式完成.如果你真的坚持不使用boost,你可以检查它的作用并做到这一点.这很简单.
try
{
double x = boost::lexical_cast<double>(str); // double could be anything with >> operator.
}
catch(...) { oops, not a number }
Run Code Online (Sandbox Code Playgroud)
szx*_*szx 22
使用C++ 11编译器,对于非负整数,我会使用类似的东西(注意::代替std::):
bool is_number(const std::string &s) {
return !s.empty() && std::all_of(s.begin(), s.end(), ::isdigit);
}
Run Code Online (Sandbox Code Playgroud)
Mep*_*ane 16
我建议采用正则表达式方法.一个完整的正则表达式匹配(例如,使用boost :: regex)
-?[0-9]+([.][0-9]+)?
Run Code Online (Sandbox Code Playgroud)
会显示字符串是否为数字.这包括正数和负数,整数以及小数.
其他变化:
[0-9]+([.][0-9]+)?
Run Code Online (Sandbox Code Playgroud)
(只有正面)
-?[0-9]+
Run Code Online (Sandbox Code Playgroud)
(仅整数)
[0-9]+
Run Code Online (Sandbox Code Playgroud)
(只有正整数)
Dav*_*tor 15
我只是想抛出这个使用迭代的想法,但其他一些代码执行迭代:
#include <string.h>
bool is_number(const std::string& s)
{
return( strspn( s.c_str(), "-.0123456789" ) == s.size() );
}
Run Code Online (Sandbox Code Playgroud)
它在检查小数点或减号时应该是不健壮的,因为它允许每个和任何位置有多个.好消息是它只是一行代码,不需要第三方库.
取出'.' ' - '如果允许正整数.
tzw*_*ckl 12
使用此解决方案,您可以检查从负数到正数甚至浮点数的所有内容.当您将类型更改num为整数时,如果字符串包含一个点,您将收到错误.
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
string s;
cin >> s;
stringstream ss;
ss << s;
float num = 0;
ss >> num;
if(ss.good()) {
cerr << "No Valid Number" << endl;
}
else if(num == 0 && s[0] != '0') {
cerr << "No Valid Number" << endl;
}
else {
cout << num<< endl;
}
}
Run Code Online (Sandbox Code Playgroud)
证明:C++程序
mpa*_*i14 12
这是使用<regex>库执行此操作的另一种方法:
bool is_integer(const std::string & s){
return std::regex_match(s, std::regex("[(-|+)|][0-9]+"));
}
Run Code Online (Sandbox Code Playgroud)
我发现以下代码是最可靠的(c ++ 11)。它同时捕获整数和浮点数。
#include <regex>
bool isNumber( std::string token )
{
return std::regex_match( token, std::regex( ( "((\\+|-)?[[:digit:]]+)(\\.(([[:digit:]]+)?))?" ) ) );
}
Run Code Online (Sandbox Code Playgroud)
这是检查正整数的解决方案:
bool isPositiveInteger(const std::string& s)
{
return !s.empty() &&
(std::count_if(s.begin(), s.end(), std::isdigit) == s.size());
}
Run Code Online (Sandbox Code Playgroud)
布伦丹这个
bool isNumber(string line)
{
return (atoi(line.c_str()));
}
Run Code Online (Sandbox Code Playgroud)
差不多就可以了。
假设任何以 0 开头的字符串都是数字,只需添加此情况的检查
bool isNumber(const string &line)
{
if (line[0] == '0') return true;
return (atoi(line.c_str()));
}
Run Code Online (Sandbox Code Playgroud)
ofc“123hello”将返回 true,就像 Tony D 指出的那样。
小智 5
尝试这个:
isNumber(const std::string &str) {
return !str.empty() && str.find_first_not_of("0123456789") == string::npos;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
273557 次 |
| 最近记录: |