2012-02-26 3 views
0

저는 C++에서 가장 경험이 많지 않지만, 이처럼 간단한 함수가 제대로 작동하는 데 문제가 있다는 것에 놀랐습니다. 내가 바라는 것은 사용자의 입력을 받아서 (예기치 않은 입력으로 인해 충돌을 일으키지 않고) 정수를 얻은 다음 그 값을 호출 함수에 반환하는 함수입니다. 특수 문자 나 공백을 허용해서는 안됩니다. 기본적으로, 나는 단지 내가 아래에 게시합니다 자바 상당처럼되고 싶어 :C++ getInt() 함수 (자바에 해당하는 것이 있습니다)

public static int getInt() 
{ 
    boolean isNum = false; //test variable 
    String str; //to hold input 

    do 
    { 
     str = keyboard.nextLine(); 
     if (!(isNum = str.matches("\\d+"))) 
     { 
      System.out.println("Enter a valid whole number, try again."); 
     } 
    } while(!isNum); 

    return Integer.parseInt(str); 
} 
+4

을 당신이 직면하고있는 * 구체적인 * 문제는 무엇입니까? (일명 "우리는 당신을 위해 코드를 작성하지 않을 것"). –

+0

cin >> intValue는 어떨까요? 너에게 효과가 없어? –

+0

cin >> int;를 사용합니다. 예상되는 입력이 입력되는 한 작동합니다. 텍스트 문자를 입력하면 무한 루프에 빠지게되는데 이는 피하려고하는 것입니다. –

답변

2

당신은 단지 cin >> [int variable]int을 읽고, 그것을 성공 확인하려고합니다. 그렇지 않은 경우, 세척 린스, 반복 :

int i; 

while (!(cin >> i)) { 
    cout << "Enter a valid integer, try again: "; 
    cin.clear(); 
    cin.ignore(std::numeric_limits<int>::max(), '\n'); 
} 

return i; 

가 작동 할 수 있지만,이 (12)를 읽고 있기 때문에

12

처럼 입력을 제공 할 때 12를 반환합니다 a에서 중지하십시오. "할 수있는만큼 얻으려고"하고 전체 라인 (Java 스 니펫이 분명히하는 것)을 읽고 싶지 않은 경우 std::getline을 사용하고 결과 문자열을 std::stoi과 함께 정수로 변환하려고합니다.

string line; 
int integer = 0; 

while (std::getline(cin, line)) 
    try { 
     integer = std::stoi(line); 
     break; 
    } catch (...) { 
     cout << "Enter an integer, try again: "; 
    } 

return integer; 

그 방법 것

(143) 영국 BBC와 같은 입력에하지 반환

는 전체 라인을 변환하려고하기 때문에 143 bbc을 정수로 변환하고 bbc을 정수로 변환 할 수 없기 때문에 사용자에게 다시 시도하라고 알려줍니다. 전체 행이 정수 입력 인 경우에만 리턴됩니다.

실제로 자바 예제와 같이 regexen을 사용하여이 작업을 수행 할 수 있지만이 간단한 작업을 위해 정규식을 꺼내는 것은 낭비라고 생각합니다.

편집 : 대신 그것을 절단의 진수 입력을 거부 할 경우, 당신은 double에 입력을 변환하고 그것이 소수 부분이없는 확인하기 위해 확인하실 수 있습니다

:

string line; 
double d = 0; 

while (std::getline(cin, line)) 
    try { 
     d = std::stod(line); 

     if (std::fmod(d, 1) != 0) 
      throw 0; 

     break; 
    } catch (...) { 
     cout << "Enter an integer, try again: "; 
    } 

return d; 
+0

답장을 보내 주셔서 감사합니다. 나열된 두 번째 코드 블록은 필자가 원했던 것입니다. 글자가 입력되면 무한 루프를 막습니다. 내가 지금 볼 수있는 유일한 문제는 입력을 받아들이고 새 입력을받는 대신 소수 부분을자를 10 진수 형식의 숫자를 입력 할 때입니다. 나는 그 문제가 무엇인지 알아 내려고 노력할 것이다 ... 나는 그것이 아마도 stoi 함수를 가지고 있다고 가정하고있을 것이다. 아마도 그것을위한 라이브러리 문서를 조사해야 할 것이다. –

+0

@ R.Brown 대신에'std :: stod'를 사용하여 double로 변환 한 다음, 성공하면 그것을 반환 할 때'int'로 캐스팅하십시오. 그러면 그것을 자릅니다. –

+0

이미 잘 렸습니다. 10 진수 입력 또는 정수 형식으로 입력되지 않은 항목을 거부하려고합니다. –

관련 문제