如何检查C++字符串是否为int?

use*_*231 37 c++ string types stringstream

当我使用时getline,我会输入一串字符串或数字,但我只想让while循环输出"word",如果它不是数字.那么有没有办法检查"word"是否是一个数字?我知道我可以atoi()用于C字符串,但字符串类的字符串怎么样?

int main () {
  stringstream ss (stringstream::in | stringstream::out);
  string word;
  string str;
  getline(cin,str);
  ss<<str;
  while(ss>>word)
    {
      //if(    )
        cout<<word<<endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

pae*_*bal 66

另一个版本......

使用strtol,将其包装在一个简单的函数中以隐藏其复杂性:

inline bool isInteger(const std::string & s)
{
   if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false;

   char * p;
   strtol(s.c_str(), &p, 10);

   return (*p == 0);
}
Run Code Online (Sandbox Code Playgroud)

为什么strtol

就我喜欢C++而言,就我而言,有时候C API是最好的答案:

  • 对于被授权失败的测试,使用异常是过度的
  • 当C标准库有一个鲜为人知的专用函数来完成工作时,词法强制转换创建的临时流对象是过度和过度低效的.

它是如何工作的 ?

strtol 乍一看似乎非常原始,所以解释会使代码更容易阅读:

strtol将解析字符串,停止在第一个不能被视为整数一部分的字符.如果你提供p(如上所述),它会p在第一个非整数字符处设置.

我的理由是,如果p未设置为字符串的末尾(0字符),则字符串中存在非整数字符s,这意味着s不是正确的整数.

第一个测试用于消除拐角情况(前导空格,空字符串等).

当然,这个功能应该根据您的需要进行定制(导致空格出错?等等).

资料来源:

请参阅以下网站的说明strtol:http://en.cppreference.com/w/cpp/string/byte/strtol.

也见的描述strtol的姐姐函数(strtod,strtoul等).

  • +1,到目前为止最好的答案.lexical_cast是矫枉过正的,它接近于糟糕的做法. (2认同)

Fer*_*isi 58

如果输入是数字加文本,则接受的答案将给出误报,因为"stol"将转换第一个数字并忽略其余数字.

我最喜欢以下版本,因为它是一个很好的单行程,不需要定义一个功能,你只需要复制和粘贴到你需要的地方.

#include <string>

...

std::string s;

bool has_only_digits = (s.find_first_not_of( "0123456789" ) == std::string::npos);
Run Code Online (Sandbox Code Playgroud)

编辑:如果你喜欢这个实现,但你想将它作为一个函数使用,那么这应该做:

bool has_only_digits(const string s){
  return s.find_first_not_of( "0123456789" ) == string::npos;
}
Run Code Online (Sandbox Code Playgroud)

  • “这是一个很好的单行代码,不需要定义一个函数,你可以在任何需要的地方复制和粘贴”,但你应该定义一个函数。请不要复制和粘贴代码。 (2认同)
  • @FerdinandoRandisi 负数怎么样? (2认同)

Kar*_*oor 15

你可以试试boost::lexical_cast.bad_lexical_cast如果失败则抛出异常.

在你的情况下:

int number;
try
{
  number = boost::lexical_cast<int>(word);
}
catch(boost::bad_lexical_cast& e)
{
  std::cout << word << "isn't a number" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*one 8

如果您只是检查是否word是数字,那不是太难:

#include <ctype.h>
Run Code Online (Sandbox Code Playgroud)

...

string word;
bool isNumber = true;
for(string::const_iterator k = word.begin(); k != word.end(); ++k)
    isNumber &&= isdigit(*k);
Run Code Online (Sandbox Code Playgroud)

根据需要进行优化.


cmo*_*cmo 5

使用全能的 C stdio/string 函数:

int dummy_int;
int scan_value = std::sscanf( some_string.c_str(), "%d", &dummy_int);

if (scan_value == 0)
    // does not start with integer
else
    // starts with integer
Run Code Online (Sandbox Code Playgroud)