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

标签 c++ string types stringstream

当我使用 getline 时,我会输入一堆字符串或数字,但我只希望 while 循环输出不是数字的“单词”。 那么有没有办法检查“单词”是否是一个数字?我知道我可以使用 atoi() C-strings 但是对于 string 类的字符串呢?

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

最佳答案

另一个版本...

使用 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);
}

为什么是 strtol

就我喜欢 C++ 而言,有时 C API 是我所关心的最佳答案:

  • 对于授权失败的测试来说,使用异常是多余的
  • 当 C 标准库有一个鲜为人知的专用函数来完成这项工作时,词法转换创建的临时流对象是过度杀伤和效率过低的。

它是如何工作的?

strtol 乍一看似乎很原始,因此解释将使代码更易于阅读:

strtol 将解析字符串,在第一个不能被视为整数一部分的字符处停止。如果您提供 p(就像我在上面所做的那样),它会将 p 设置在第一个非整数字符处。

我的推理是,如果 p 没有设置到字符串的末尾(0 字符),那么字符串 s 中有一个非整数字符,表示 s 不是正确的整数。

第一个测试是为了消除极端情况(前导空格、空字符串等)。

当然,该功能应该根据您的需要进行定制(前导空格是错误的吗?等等)。

来源:

参见strtol的描述:http://en.cppreference.com/w/cpp/string/byte/strtol .

还可以查看 strtol 的姐妹函数(strtodstrtoul 等)的描述。

关于c++ - 如何检查 C++ 字符串是否为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2844817/

相关文章:

c - 未指定长度的数组的问题

c++ - 将 short 打包/解包为 int

c++ - pthread_cond_wait 没有按照我的预期进行

c++ - 通过套接字 C++ 发送长字符串

java - 使用 Hadoop Map-Reduce 去除不可打印的字符

haskell - 从类型列表中获取常规列表

c++ - 从出现在该值之前的 vector<pair> 添加第二个值

c++ - 二维数组更改多个值而只更改一个值

javascript - jQuery 替换字符串中的 HTML

types - 从 if 语句分配一个未装箱的闭包