2009-09-16 41 views
2

我想写一个if语句,但找不到合适的表达式来使用。我正在考虑写这样的东西:C++语法问题:if var!= type int

if (var != type(int)) 

但是,我不确定如何去做到这一点,并且此方法不起作用。

我是否至少在正确的思路上思考?

+0

你的if语句的内容是什么? (换句话说,你想避免用int来做什么?) – 2009-09-16 20:30:04

+2

int n;如果(cin >> n){...}如果你进入if语句,那么你知道你的变量n正确地从一个字符串转换而来。在C++中,类型在编译时已知,所以你的问题有点奇怪。 – 2009-09-16 20:45:02

+1

也许这将有助于澄清,因为您似乎熟悉Python:在Python和C++中,当您读取输入时,都会将其作为字符串读取。您必须将该字符串转换为整数。你的问题是你想确定转换是否成功。关键的一点是,在C++中,由于您声明'var'是一个整数,它将始终是一个整数。无论从字符串到整数的转换是否成功都没有关系,“var”将是一个整数。那有意义吗? – 2009-09-16 20:52:39

回答

18

这听起来像你想重载一个函数:

void foo(int i) 
{ 
    // stuff 
} 

void foo(float f) 
{ 
    // stuff 
} 

int main(void) 
{ 
    int i = 10; 
    float f = 1.0f; 

    foo(i); // calls foo(int) 
    foo(f); // calls foo(float) 
} 

如果你想int - 特殊行为,然后东西在所有其他情况一样,你可以使用模板:

template <typename T> 
void foo(T t) 
{ 
    // T is something 
} 

template <> 
void foo(int i) 
{ 
    // for int's only 
} 

int main(void) 
{ 
    int i = 10; 
    float f = 1.0f; 
    double d = 2.0; 

    foo(i); // calls specialized foo 
    foo(f); // calls generic foo 
    foo(d); // calls generic foo 
} 

根据您的评论(“手头任务是一个简单的程序:取两个用户输入整数,并将其添加输入限制只有整数i。可以在Python中完成,我也在考虑这些方面。如果num1!= type(int):print“您没有输入整数,请输入一个整数。”其他:继续”),你想是这样的:

#include <iostream> 

int main(void) 
{ 
    int i; 
    std::cin >> i; 

    if (std::cin.fail()) 
    { 
     std::cout << "Not valid!" << std::endl; 
    } 
    else 
    { 
     // ... 
    } 
} 

这将通知无效的输入,如 “@#$”, “R13”,但确实捕案件,如 “34fg” “12 $#%”,因为它将分别读取int,并分别停在“fg”和“$#%”

要检查,您必须读入一行输入,然后尝试该行转换成你想要的类型(谢谢,litb)这意味着你的问题是更like this question:。

#include <iostream> 
#include <sstream> 
#include <string> 

int main(void) 
{ 
    std::string input; 
    std::getline(std::cin, input); 

    std::stringstream ss(input); 
    int i; 
    ss >> i; 

    if (ss.fail() || !(ss >> std::ws).eof()) 
    { 
     std::cout << "Not valid!" << std::endl; 
    } 
    else 
    { 
     // ... 
    } 
} 

这样做:获得输入,并将其放入一个stringstream。然后解析int后,流出任何剩余的空白。之后,如果eof为false,则表示存在遗留字符;输入无效。

这更容易使用包装在一个函数中。在另一个问题中,演员被重新考虑了。在这个问题中,我们使用了演员阵容,但是随着它一起包装了输入。

#include <iostream> 
#include <sstream> 
#include <string> 

bool parse_int(int& i) 
{ 
    std::string input; 
    std::getline(std::cin, input); 

    std::stringstream ss(input); 
    ss >> i; 

    return !(ss.fail() || !(ss >> std::ws).eof()); 
} 

int main(void) 
{ 
    int i; 

    if (!parse_int(i)) 
    { 
     std::cout << "Not valid!" << std::endl; 
    } 
    else 
    { 
     // ... 
    } 
} 

或者更一般地:

#include <iostream> 
#include <sstream> 
#include <string> 

template <typename T> 
bool parse_type(T& t) 
{ 
    std::string input; 
    std::getline(std::cin, input); 

    std::stringstream ss(input); 
    ss >> t; 

    return !(ss.fail() || !(ss >> std::ws).eof()); 
} 

int main(void) 
{ 
    int i; 

    if (!parse_type(i)) 
    { 
     std::cout << "Not valid!" << std::endl; 
    } 
    else 
    { 
     // ... 
    } 
} 

这使你可以分析其他类型的错误检查。


如果你没事例外,使用lexical_cast(无论是从提升,或“伪造”,看到其他问题挂钩的代码[同上链接]),您的代码会是这个样子:

#include <iostream> 
#include <sstream> 
#include <string> 

/* Faked lexical-cast from question: 
https://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/ 
*/ 
template <typename T> 
T lexical_cast(const std::string& s) 
{ 
    std::stringstream ss(s); 

    T result; 
    if ((ss >> result).fail() || !(ss >> std::ws).eof()) 
    { 
     throw std::bad_cast("Bad cast."); 
    } 

    return result; 
} 


template <typename T> 
T parse_type(void) 
{ 
    std::string input; 
    std::getline(std::cin, input); 

    return lexical_cast<T>(input); 
} 

int main(void) 
{ 
    try 
    { 
     int i = parse_type<int>(); 
     float f = parse_type<float>(); 
    } 
    catch (const std::exception& e) 
    { 
     std::cout << e.what() << std::endl; 
    } 
} 

我不认为有提升词汇蒙上了无抛出的版本,所以我们可以通过捕捉bad_cast的使此代码的真正的/,而不是虚假的例外版本,如下所示。再次,这可以与boost或自定义词法转换一起使用。 (凡是做一个词汇演员和抛出bad_cast):

#include <iostream> 
#include <sstream> 
#include <string> 

/* Faked lexical-cast from question: 
https://stackoverflow.com/questions/1243428/convert-string-to-int-with-bool-fail-in-c/ 
*/ 
template <typename T> 
T lexical_cast(const std::string& s) 
{ 
    std::stringstream ss(s); 

    T result; 
    if ((ss >> result).fail() || !(ss >> std::ws).eof()) 
    { 
     throw std::bad_cast("Bad cast."); 
    } 

    return result; 
} 


template <typename T> 
bool parse_type(T& t) 
{ 
    std::string input; 
    std::getline(std::cin, input); 

    try 
    { 
     t = lexical_cast<T>(input); 

     return true; 
    } 
    catch (const std::bad_cast& e) 
    { 
     return false; 
    } 
} 

int main(void) 
{ 
    int i; 
    if (!parse_type(i)) 
    { 
     std::cout << "Bad cast." << std::endl; 
    } 
} 

现在是回bool结果,但我们避免使用现有lexical_cast功能代码重复。

你当然可以选择你想使用的方法。

+3

我想知道如何有人可以给这个答案,至少对我来说是不可理解的问题!努力+1! – jdehaan 2009-09-16 20:29:43

+1

这使得更多的意义。 ws的加入也很棒。 – 2009-09-16 20:49:40

+1

谢谢。请记住,像其他人一样,C++是强类型的。这些都是从字符串流到各个类型的转换。 – GManNickG 2009-09-16 20:51:27

9

C++是一种静态类型语言,这意味着变量的类型在任何时候都是编译器已知的。因此,为了声明var,您必须指定它的类型,这会使if语句发布一个模拟点。如果你可以多描述一下你正在努力完成的任务,或许还有另外一条途径来解决你的问题。

+0

手头的任务是一个简单的程序: 取两个用户输入的整数并添加它们。 仅限输入为整数。 我可以在Python中做到这一点,我也在思考这些问题。如果num1!= type(int): print“您没有输入整数,请输入一个整数。 else: continue – 2009-09-16 20:30:06

+3

在这种情况下,我想您应该问一个问题:“我如何确保来自用户的输入限制为整数”?有几种方法可以从C++用户获得输入,并且每种方法都有验证用户数据的技术。 此外,它将有助于获得更多您在问题主体中编写的代码。 – fbrereto 2009-09-16 20:34:25

+0

您不必担心在运行时将输入类型限制为整数。类似于:int n; cin >> n;确保n始终是一个整数。 – 2009-09-16 20:34:38

0

这是正确的,需要更多的信息,如果您正在寻找Java的“instanceOf”运算符的等价物,那么除非使用RTTI和typeid,否则不会有一个。

0

你的意思是说你有一个浮点值并且想知道它是不是一个整数?

在这种情况下,试试这个:

#include <math.h> 

//... 

double x = 5.0; 
if(round(x) == x) { 
    // x has an integer value 
} 

或者,如果值是一些计算的结果,有可能是小的舍入误差。然后尝试这样:

double x = 4.99999999999; 
if(abs(round(x) - x) < 1e-8)