我有一个简单的程序,定期输入的是数字(几乎猜测游戏),但是我需要添加一个选项,如果用户键入“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'
答案 0 :(得分:0)
使用strtol(http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/)代替atoi。
long int strtol ( const char * str, char ** endptr, int base );
如果成功,您将获得非零值并且endptr已移动。如果endptr没有移动你知道它是失败的。如果失败并且结束指针移动,则在结束ptr为空格之前得到0并且内存地址。
答案 1 :(得分:-1)
请检查您的三种情况,否则如果任何字符不是数字,请处理,否则转换并继续。
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
}
}
答案 2 :(得分:-1)
如果无法执行有效转换,atoi返回0.您可以处理它。