当我使用 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
的姐妹函数(strtod
、strtoul
等)的描述。
关于c++ - 如何检查 C++ 字符串是否为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2844817/