문제

이 질문은 이미 여기에 답이 있습니다.

나는 C ++를 배우고 내가 갈 때 작은 프로그램을 작성하고 있습니다. 다음은 그러한 프로그램 중 하나입니다.

// This program is intended to take any integer and convert to the
// corresponding signed char.

#include <iostream>

int main()
{
  signed char sch = 0;
  int n = 0;
  while(true){
    std::cin >> n;
    sch = n;
    std::cout << n << " --> " << sch << std::endl;
  }
}

이 프로그램을 실행하고 합리적으로 작은 절대 값으로 입력을 유지하면 예상대로 작동합니다. 그러나 더 큰 입력 (예 : 100000000000)을 입력하면 프로그램이 동일한 출력을 반복적으로 뱉어냅니다. 입력의 일부 조합은 불규칙한 동작을 유발합니다. 예를 들어:

#: ./int2ch
10
10 --> 

10000000000
10 -->

10 -->

10 -->

10 -->

이 프로그램은 죽을 때까지 "10->"를 뱉어냅니다. (이 특정 입력 시퀀스를 사용하면 프로그램의 출력이 속도가 속도로 변경됩니다.) 또한 큰 값의 출력은 이전의 법적 입력과 현재 불법 입력의 값에 의해 결정된다는 것을 알았습니다.

무슨 일이야? (나는 프로그램 수정에 관심이 없다. 쉽다. 이해하고 싶다.)

도움이 되었습니까?

해결책

기본적으로 당신 cin 스트림은 실패 상태에 있으므로 읽으려고 할 때 즉시 반환됩니다. 다음과 같이 예제를 다시 작성하십시오.

#include <iostream>

int main()
{
  signed char sch = 0;
  int n = 0;
  while(std::cin >> n){
    sch = n;
    std::cout << n << " --> " << sch << std::endl;
  }
}

cin >> n 참조를 반환합니다 cin, 조건부에서 "좋은"을 테스트 할 수 있습니다. 그래서 기본적으로 "while(std::cin >> n)""표준 입력에서 여전히 성공적으로 읽을 수는 있지만 다음을 수행하십시오 "라고 말합니다.

편집 : 마지막으로 입력 한 마지막 좋은 값을 반복적으로 출력하는 이유는 N에서 성공적으로 읽은 마지막 값이기 때문입니다. 실패한 판독 값은 n의 값을 변경하지 않습니다.

편집 : 주석에 언급 된 바와 같이, 오류 상태를 지우고 이와 같은 것을 다시 시도 할 수 있으며 아마도 작동하지 않을 것입니다.

#include <iostream>
#include <climits>

int main() {
    signed char sch = 0;
    int n = 0;
    while(true) {
        if(std::cin >> n) {
            sch = n;
            std::cout << n << " --> " << sch << std::endl;
        } else {
            std::cin.clear(); // clear error state
            std::cin.ignore(INT_MAX, '\n'); // ignore this line we couldn't read it
        }
    }
}

다른 팁

예, Evan Teran은 이미 대부분의 것을 지적했습니다. 내가 추가하고 싶은 한 가지는 (아직 그의 의견을 언급 할 수 없기 때문에 :)) 당신은 istream :: clear에 전화를 걸어야한다는 것입니다. ~ 전에 Istream에 대한 호출 :: 무시. 그 이유는 istream :: 무시 마찬가지로 스트림이 여전히 실패 상태에 있으면 아무것도하지 않기 때문입니다.

당신이 32 비트 기계에 있다는 것을 감안할 때, 100000000000은 int로 표현하기에는 너무 큰 숫자입니다. 또한 int를 숯으로 변환하면 컴파일러에 따라 0..255 또는 -128..127에서만 제공합니다.

여기서 한 가지 문제는 a입니다 char 크기는 1 바이트의 크기를 가지므로 -127에서 128 사이의 숫자 만 보유 할 수 있습니다. int 반면에 일반적으로 4 바이트이며 훨씬 더 큰 값을 취할 수 있습니다. 두 번째 문제는 당신이 너무 큰 값을 입력하고 있다는 것입니다. int.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top