如何识别一个字符串是否是一个数字,如果是,将其转换为一个int? (C++)
可能重复:
How to parse a string to an int in C++?如何识别一个字符串是否是一个数字,如果是,将其转换为一个int? (C++)
我有一个简单的程序,这就是输入经常是数字(猜谜游戏差不多),但我需要的地方,如果增加一个选项用户键入“帮助”或“/ 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'
只是检查你的三个案例中,否则,如果任何字符不是一个数字,处理,否则转换并继续进行。
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
}
}
如果没有有效的转换可以执行,atoi返回0.然后你可以处理它。
如果实际输入为0,该怎么办? – 2012-03-22 05:04:15
如果传递的数字是0,该怎么办?这是为什么stringstream是string-> int转换更好的选择的好理由。正如在重复链接中看到的,它可能不是最好的,但它确实有效。 – chris 2012-03-22 05:04:35
这就是为什么你不使用'atoi'。至少使用'strtol',但这是C++,所以使用'stringstream'。 – 2012-03-22 05:18:01
使用strtol(http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/)而不是atoi。
long int strtol (const char * str, char ** endptr, int base);
如果成功,您将得到一个非零值并且endptr已经移动。如果endptr没有移动,你就知道这是一个失败。如果失败并且结束指针移动,则在结束ptr为空格之前,您将得到一个0和内存地址。
你在想什么。以字符串输入,检查你的特殊情况,然后将其他东西转换为int – 2012-03-22 05:00:13
@BrianRoach是的,我知道那是我需要做的......我需要将所有输入转换为一个字符串,然后执行检查,问题是如何做检查? – 2012-03-22 05:03:37
@GalAppelbaum - 输入*是*字符串(文本)数据。 – 2012-03-22 05:07:26