2012-03-22 57 views
-1

可能重复:
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' 
+1

你在想什么。以字符串输入,检查你的特殊情况,然后将其他东西转换为int – 2012-03-22 05:00:13

+0

@BrianRoach是的,我知道那是我需要做的......我需要将所有输入转换为一个字符串,然后执行检查,问题是如何做检查? – 2012-03-22 05:03:37

+0

@GalAppelbaum - 输入*是*字符串(文本)数据。 – 2012-03-22 05:07:26

回答

-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 
    } 
} 
-1

如果没有有效的转换可以执行,atoi返回0.然后你可以处理它。

+0

如果实际输入为0,该怎么办? – 2012-03-22 05:04:15

+0

如果传递的数字是0,该怎么办?这是为什么stringstream是string-> int转换更好的选择的好理由。正如在重复链接中看到的,它可能不是最好的,但它确实有效。 – chris 2012-03-22 05:04:35

+0

这就是为什么你不使用'atoi'。至少使用'strtol',但这是C++,所以使用'stringstream'。 – 2012-03-22 05:18:01

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和内存地址。

相关问题