2010-03-09 5 views
9

>> 문자를 int 변수로 변환하면 어떻게됩니까? 두 개의 int 값을 추가하기 위해 간단한 코드를 시도했다. 그러나 편지를 쓸 때, 실패하고 화면에 수많은 숫자를 인쇄합니다. 그러나이 오류의 원인은 무엇입니까? 내 말은, 나는 그 편지의 ASCII 코드를 적재하고 사용하기를 기대했다. 명시 적으로 int로 당신의 문자를 캐스팅하면 당신은 당신이 점점 이상한 결과를 얻을 수 있도록C++에서 int로

+1

사용한 코드를 게시 할 수 있습니까? –

답변

3

, 그것은, 다른 사람이 int로 그 자체로 캐스팅하고 아니에요, ASCII 코드를 사용합니다.

int n; 
while (someCondition) { 
    std::cin >> n; 
    ..... 
    std::cout << someOutput; 
} 

당신은 정수, 스트림 (표준 : CIN)으로 읽을 수없는 뭔가를 입력 실패한을 입력 :

1

당신은 int istream::get();

10

를 사용할 수 있습니다 난 당신과 같은 코드가 있다고 가정 상태 및 다음 모든 입력 시도가 입력 오류를 처리하지 않는 한 실패합니다.

당신은 입력 작업의 성공 테스트 할 수 있습니다

if (!(std::cin >> n)) //failed to read int 

을하고 (입력 실패의 원인 입력) 처리되지 않은 문자를 좋은 상태로 스트림을 복원하고 폐기 할 수

std::cin.clear(); 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

또 다른 가능성은 문자열 변수에 입력을 받아들이고 (거의 실패하지 않음) 문자열을 int로 변환하려고 시도하는 것입니다.

이 입력에 매우 일반적인 문제이며 여기에 다른 곳에서 그것에 대해 스레드의 톤이 있어야한다.

+0

고마워, 내가 맞다면, stdout은 실제로 프로그램에 ASCII 코드를 보내지 만, std :: cin은 그것이 어떤 타입인지 인식하고 그렇게 사용한다. – Vit

+1

** int ** 변수에 대한 입력을 예상하면 "123"은 정상이지만 "xyz"는 입력 작업을 실패하게 만듭니다. 스트림은 입력에서 일련의 문자를 가져 오지만 요청한 유형으로의 변환을 수행하고 테스트 할 수있는 방식으로 실패를 표시합니다. – visitor

1

문제는 정수 변수로 읽을 때, C++ 스트림을 사용하여 입력 방법은 '+'와 같은 번호를 만들 수있는 문자를 기대하고 있다는 것입니다 '-', '0'... '9 '. 이 집합에없는 문자는 입력을 종료하고이 문자로부터 숫자가 만들어집니다.

은 문자의 ASCII 값을 얻으려면, 당신은 char 변수로 데이터를 입력해야합니다. 내부적으로 ASCII 값을가집니다 (프로그램이 16 비트 문자 또는 EBCDIC을 읽지 않는 경우). ASCII 값을보고 싶다면 char 변수를 정수로 출력해야합니다 (일반적으로 출력 전에 캐스트가 필요함).

정수를 읽는 것은 실패 할 경우

이 프로그램은 입력이 올바르지 사용자를 통보해야합니다. 프로그램이 입력 데이터를 처리하기 전에 사용자가 번호를 다시 입력해야 할 수도 있습니다. 당신은 같은 일을

1

:

int x; 
cin >> x; 

당신은 C를 지시됩니다 ++ 키보드에서 int를 읽을 것으로 예상합니다. 사실 int이 아닌 것을 입력하면 입력 스트림 (이 경우 표준 입력)은 오류 상태로 인해 사용할 수 없게 렌더링됩니다. 저는 개인적으로 항상 문자열을 읽어 선호하고, 필요한 경우 숫자로 변환 이유

. 이 기능을 지원하는 C++ 표준 라이브러리의 C 부분에는 변환 함수가 있습니다.

double cnvtToNumber(const std::string &num) 
{ 
    char * ptr; 
    double toret = strtod(num.c_str(), &ptr); 

    if (*ptr != 0) { // If it got to the end of the string, then it is correct. 
     throw std::runtime_error("input was not a number"); 
    } 
    return toret; 
} 

여기서는 숫자를 변환하고 변환이 올바른지 감지합니다.strtod(s)은 문자열의 끝이나 공백을 찾을 때만 중지됩니다.

std::string &trim(std::string &str) 
{ 
    // Remove trailing spaces 
    unsigned int pos = str.length() -1; 

    while(str[ pos ] == ' ') { 
     --pos; 
    } 

    if (pos < (str.length() -1)) { 
     str.erase(pos + 1); 
    } 

    // Remove spaces at the beginning 
    pos = 0; 
    while(str[ pos ] == ' ') { 
     ++pos; 
    } 

    if (pos < 1) { 
     str.erase(0, pos); 
    } 

    return str; 
} 
이제

안전하게 콘솔 (또는 어떤 다른 입력 스트림)에서 읽을 수 있습니다 : 함수를 속여 후행 공백을 방지하기 위해, 당신은 트림 기능을 필요로 할 수 물론

int main() 
{ 
    std::string entry; 

    try { 
     std::getline(std::cin, entry); 
     int age = cnvtToNumber(trim(entry)); 

     std::cout << age << std::endl; 
    } catch(const std::exception &e) { 
     std::cerr << e.what() << std::endl; 
    } 
} 

당신이 할 수있는 항상 double을 읽고 변환하면 정밀도가 떨어집니다. 추가 조사가 필요한 경우에 대비하여 정수 (strtol(s))에 대한 특정 기능이 있습니다.