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是最好的答案:
strtol 乍一看似乎非常原始,所以解释会使代码更容易阅读:
strtol将解析字符串,停止在第一个不能被视为整数一部分的字符.如果你提供p(如上所述),它会p在第一个非整数字符处设置.
我的理由是,如果p未设置为字符串的末尾(0字符),则字符串中存在非整数字符s,这意味着s不是正确的整数.
第一个测试用于消除拐角情况(前导空格,空字符串等).
当然,这个功能应该根据您的需要进行定制(导致空格出错?等等).
请参阅以下网站的说明strtol:http://en.cppreference.com/w/cpp/string/byte/strtol.
也见的描述strtol的姐姐函数(strtod,strtoul等).
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)
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)
如果您只是检查是否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)
根据需要进行优化.
使用全能的 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)
| 归档时间: |
|
| 查看次数: |
115709 次 |
| 最近记录: |