如何识别字符串是否为数字,如果是,则将其转换为int?(C++)
how to identify if a string is a number and if it is, convert it to an int? (C++)
可能重复:
如何在C++中将字符串解析为int?
我有一个简单的程序,它经常输入数字(几乎是猜谜游戏),但我需要添加一个选项,如果用户键入"help"或"/h"或"?",程序将显示帮助菜单。。。
所以本质上,我需要能够区分输入是字符串还是数字,如果是数字,则将其转换为int…
完成这项工作的最佳方法是什么?我知道我可以使用atoi
将字符串转换为int,但如何检查该值是否为数字?
谢谢!
编辑:根据我从你的回答中读到的,你们中的大多数人都说stringstream
是最好的方法。。。我编写了一小段代码,试图理解stringstream
是如何工作的,但我遇到了一些错误。。。知道为什么吗?
#include <iostream>
#include <string>
using namespace std;
int str2int (const string &str) {
std::stringstream ss(str);
int num;
if((ss >> num).fail())
{
num = 0;
return num;
}
return num;
}
int main(){
int test;
int t = 0;
std::string input;
while (t !=1){
std::cout << "input: ";
std::cin >> input;
test = str2int(input);
if(test == 0){
std::cout << "Not a number...";
}else
std::cout << test << "n";
std::cin >> t;
}
return 0;
}
错误:
Error C2079:'ss' uses undefined class std::basic_stringstream<_elem,_traits,_alloc>'
Error C2228: left of '.fail' must have class/struct/union
Error C2440: 'initializing': cannot convert 'const std::string' into 'int'
使用strtol(http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/)而不是atoi。
long int strtol ( const char * str, char ** endptr, int base );
如果成功,则获得一个非零值AND,endptr已移动。如果末端没有移动,你就知道这是一次失败。如果发生故障并且结束指针移动,则会得到一个0,并且在结束指针之前的内存地址是空白。
如果不能执行有效的转换,atoi将返回0。那你就可以应付了。
只需检查您的三种情况,否则,如果任何字符不是数字,请处理,否则转换并继续。
string input;
cin >> input;
if (input == "help" || input == "/h" or input == "?")
help();
else {
bool convertible = true;
for(string::size_type i = 0; i < input.size(); ++i) {
if (!isdigit((int)input[0])) {
convertible = false;
break;
}
}
if (convertible) {
int digit = atoi(input.c_str());
// do guessing game stuff
}
else {
// handle
}
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)