首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用C++判断一个字符串是否为数字?

如何用C++判断一个字符串是否为数字?
EN

Stack Overflow用户
提问于 2011-01-11 13:51:31
回答 31查看 407.3K关注 0票数 158

我在尝试编写一个检查字符串是否是数字的函数时遇到了不少麻烦。对于我正在编写的游戏,我只需要检查我正在读取的文件中的一行是否是一个数字(这样我就可以知道它是否是一个参数)。我写了下面的函数,我认为它工作得很顺利(或者我不小心编辑了来阻止它,或者我是精神分裂的人,或者Windows是精神分裂的人):

代码语言:javascript
运行
复制
bool isParam (string line)
{
    if (isdigit(atoi(line.c_str())))
        return true;

    return false;
}
EN

回答 31

Stack Overflow用户

回答已采纳

发布于 2011-01-11 14:08:44

最有效的方法是遍历字符串,直到找到一个非数字字符。如果有任何非数字字符,您可以认为该字符串不是数字。

代码语言:javascript
运行
复制
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();
}

或者如果你想用C++11的方式来做:

代码语言:javascript
运行
复制
bool is_number(const std::string& s)
{
    return !s.empty() && std::find_if(s.begin(), 
        s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end();
}

正如下面的注释所指出的,这只适用于正整数。如果您需要检测负整数或分数,则应该使用更健壮的基于库的解决方案。不过,添加对负整数的支持是相当微不足道的。

票数 168
EN

Stack Overflow用户

发布于 2013-05-16 05:10:28

为什么要重新发明轮子呢?C标准库(也可以在C++中使用)有一个函数可以做到这一点:

代码语言:javascript
运行
复制
char* p;
long converted = strtol(s, &p, 10);
if (*p) {
    // conversion failed because the input wasn't a number
}
else {
    // use converted
}

如果您想处理分数或科学记数法,请改用strtod (您将得到double结果)。

如果您想在C/C++风格("0xABC")中允许十六进制和八进制常量,那么将最后一个参数改为0

然后,您的函数可以编写为

代码语言:javascript
运行
复制
bool isParam(string line)
{
    char* p;
    strtol(line.c_str(), &p, 10);
    return *p == 0;
}
票数 103
EN

Stack Overflow用户

发布于 2013-08-01 00:38:48

使用C++11编译器,对于非负整数,我会使用如下代码(注意::而不是std::):

代码语言:javascript
运行
复制
bool is_number(const std::string &s) {
  return !s.empty() && std::all_of(s.begin(), s.end(), ::isdigit);
}

http://ideone.com/OjVJWh

票数 51
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4654636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档