2009-09-16 3 views
2

if 문을 쓰려고하는데 사용할 적절한 식 형식을 찾을 수 없습니다. 정확히 어떻게이 일에 대해 갈C++ 구문 질문 : if var! = type int

if (var != type(int)) 

는 그러나, 나는 확실하지 오전,이 방법은 작동하지 않습니다 :이 같은 것을 쓰고 생각 해요.

적어도 올바른 라인을 생각하고 있습니까?

+0

if 문 본문에있는 내용은 무엇입니까? (즉, int를 사용하여 무엇을하려고하지 않습니까?) –

+2

int n; if (cin >> n) {...} if 문 안에 들어가면 변수 n이 문자열에서 올바르게 변환 된 것입니다. C++에서 유형은 컴파일 타임에 알려 지므로 질문이 이상합니다. –

+1

아마 파이썬에 익숙한 것 같아서 분명히 알 수 있습니다. 파이썬과 C++ 모두에서 입력을 읽을 때 그것을 문자열로 읽습니다. 그 문자열을 정수로 변환해야합니다. 문제는 해당 변환이 성공했는지 여부를 확인하려는 것입니다. 요점은, C++에서는'var'을 정수로 선언 했으므로 항상 정수입니다. 문자열에서 정수로의 변환이 성공했는지 여부는 중요하지 않으며,'var'는 정수가 될 것입니다. 말이 돼? –

답변

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 
} 

귀하의 의견 ("작업은 간단합니다 : 두 개의 사용자가 입력 한 정수를 받아서 추가하십시오. 입력을 정수로만 제한하십시오. 파이썬에서 그것을 할 수 있고 나는 그 라인을 따라 생각하고있다. if 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이 거짓이면 왼쪽 문자가 있음을 나타냅니다. 입력이 유효하지 않습니다.

이것은 랩핑 된 함수를 사용하는 것이 훨씬 쉽습니다. 다른 질문에서는, 던지기는 re-factored 멀리이었다; 이 질문에서 우리는 캐스트를 사용하고 있지만 입력을 함께 감싸는 것입니다.

#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를 어휘 캐스트를 수행하고 던졌습니다 아무것도) : 우리가 기존 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> 
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 결과에있다.

물론 원하는 방법을 선택할 수 있습니다.

+3

나는 누군가가 이것에 대한 답을 어떻게 나에게 줄 수 있는지 궁금하다. +1 노력! – jdehaan

+1

이것은 훨씬 더 의미가 있습니다. ws 추가도 훌륭합니다. –

+1

감사합니다. 다른 사람들이 말하는 것처럼 C++은 강력한 형식을 사용합니다. 이들은 모두 문자열 - 스트림에서 각 유형으로의 변환입니다. – GManNickG

9

C++은 정적 유형의 언어입니다. 즉, 변수 유형이 항상 컴파일러에 알려짐을 의미합니다. 따라서 var을 선언하려면 해당 유형을 지정해야합니다.이 유형을 사용하면 moot point를 게시 한 if 문을 작성할 수 있습니다. 달성하려는 작업을 조금 더 설명 할 수 있다면 문제를 해결할 다른 경로가있을 수 있습니다.

+0

수작업은 간단한 프로그램입니다 : 두 개의 사용자 입력 정수를 가져와 추가하십시오. 입력을 정수로만 제한하십시오. 파이썬에서 할 수 있으며 그 라인을 따라 생각하고 있습니다. num1! = type (int) : print "정수를 입력하지 않았습니다. 정수를 입력하십시오." else : continue –

+3

그런 경우에는 "사용자가 입력 한 내용이 정수로 제한되어 있는지 어떻게 확인할 수 있습니까?"라는 질문을하고 싶습니다. C++로 사용자로부터 입력을받는 방법은 여러 가지가 있으며 각 방법은 사용자 데이터를 검증하는 기술을 가지고 있습니다. 또한 질문 본문에 더 많은 코드를 작성하는 데 도움이됩니다. – fbrereto

+0

런타임시 입력 유형을 정수로 제한하는 것에 대해 걱정할 필요가 없습니다. 다음과 같이 : int n; cin >> n; n은 항상 정수입니다. –

0

그렇습니다. 더 많은 정보가 필요합니다. RTTI와 typeid를 사용하지 않는 한 Java의 "instanceOf"연산자와 동일한 것을 찾고 있다면, 하나도 없습니다.

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)