2012-01-26 9 views
4

최근에 입력 된 char 데이터를 받아들이면 받아 들일 수 있는지 테스트하고 (a-z, #는 입력 끝을 표시 함) 테스트를 스택에 넣어서 그것이 회귀인지 확인합니다. 나는 그것을 한 번에 한 글자 씩 넣을 것을 기대하고 있었지만, 내가 파운드로 끝나는 줄을 입력하면 그것은 작동한다. 여기에 관련 코드의 일부는 다음과 같습니다 그래서이 프로그램은 왜 작동합니까?

char buffer; 
bool pound_test = false; 
bool palindrome = false; 
bool keep_going = true; 
stack<char> stack1, stack2, stack3; 
string str = ""; 

cout << "Please enter a string, then end it with the pound sign. " << endl; 

while(pound_test == false) { 
    cin >> buffer; 

    if((buffer >= 97) && (buffer <= 122)) 
    { 
     stack1.push(buffer); 
     stack2.push(buffer); 
     str += buffer; 
    } 

    if((buffer >= 65) && (buffer <= 90)) { 
     buffer = buffer + 32; 
     stack1.push(buffer); 
     stack2.push(buffer); 
     str += buffer; 
    } 

    if(buffer == '#') 
     pound_test = true; 
} 

, 사용자가 "레이싱 카 번호"와 같은, 하나의 긴 문자열을 입력하고 프레스 입력 할 때, 프로그램이 제대로 스택에 넣는다. 내 질문은 간단합니다 : 왜? Cin이 루프 자체에 있기 때문에 데이터가 제대로 작동하려면 한 번에 하나의 char로 데이터를 입력해야하지 않겠는가? 루프는 반복적으로 스택에 여러 문자를 입력해야합니까? 감사!

편집 : 답 해 주셔서 감사합니다/의견 모두들! 나는 정말로 빠르고 친절한 대답에 감명 받았다. 나는이 사이트를 다시 사용할 확실성이있다.

+1

그것은 단지 cin이 작동하도록 정의 된 방법이 아닙니다. 첫 번째 빈칸을 읽습니다. 한 번에 하나씩 읽고 싶다면 cin을 사용하십시오.get 또는 getchar – frankc

+1

나는 그것을 얻지 못한다. 심지어 컴파일되지도 않는다. 스택 뒤에';'이있다. '... – Blindy

+0

@Blindy : 죄송합니다. 포맷 실수입니다. P – Ryan

답변

4

대부분의 시스템에서 콘솔 입력 (cinstd::istream 개체를 통한)은 라인 버퍼입니다. 따라서 단일 문자에 대해 cin::operator>>을 호출하면 줄 바꿈을 누를 때까지 함수가 실제로 반환되지 않습니다 (기본 I/O 시스템이 그때까지 cin에 데이터를 제공하지 않기 때문에). 입력 된 모든 데이터는 을 포함하여 버퍼링되며 이후의 cin::operator>>에 대한 호출은 버퍼에서 소모 될 때까지 버퍼에서 처리됩니다.

이 경우 이 char 인 경우 이지만 실제로 콘솔은 전체 줄을 버퍼링하고 이후 콘솔 입력 작업을 만족시키기 위해 사용됩니다.

디버거에서 코드를 단계별로 실행하면 작업이 더 명확해질 수 있습니다.

+0

감사! 그것은 내 질문에 거의 답이된다. 따라서 cin에 프로그램에서 다른 호출이 있고 버퍼에 문자가 남아 있으면 사용자 입력 대신 해당 문자를 읽습니다. – Nathan

+1

@Nathan : 네, 그 점을 명확히 할 수있는 답변에 더 많은 내용을 추가했습니다. – Clifford

+0

감사합니다. 고맙습니다. – Nathan

3

"시스템"(OS, 라이브러리, 구현에 달려 있음)은 입력에서 오는 데이터 문자열을 사용하지만 프로그램은 char로 char을 읽습니다.

+1

"프로그램이 char로 char을 읽는다"는 이해는'operator >> (char *)가 아닌'operator >> (char)'의 사용 때문이다. '- cin은 한 번에 하나의 char 만 원한다는 것을 안다. – Matt

+0

@Matt 여러분이 생각한 것 (cin >> char)을 수행하거나 사용자가 char 문자열을 입력 한 다음 루프를 사용하여 char를 입력하는 것이 더 좋을 것이라고 생각합니까 (char, 원하는 문자 입력) 그것은), 스택에? – Nathan

0

cin 연산자는 표준 입력 스트림에서 읽습니다 (달리 구성되지 않은 경우). stdin은 다음과 같이 작동합니다. 입력하면 Enter을 누르면 stdin으로 전송되므로 cinEnter을 눌렀을 때까지 전체 문자열을 읽습니다.

char로 char을 읽으려면 getchar을 사용해야합니다.

+1

>>의 오른쪽 피연산자가 char 인 경우 cin이 전체 행을 읽지 않습니다. 라인 버퍼링 된 콘솔 입력을위한 개행 이후에만 데이터가 cin에 제공됩니다. 기본 시스템 수준 콘솔 I/O는 cin 객체가 아닌 버퍼링을 수행합니다. – Clifford

+0

내가 보았다. (http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/) 그것은 실제로'istream's >>와 같은 특별한 경우가있다. 'char'는 스트림에서 한 문자 만 추출합니다. 그것은 당신이 말했듯이, 버퍼링이 다른 레벨에서 수행된다는 것을 의미합니다. 감사! –

+0

실제로 "특별한 경우"는 아니지만 다른 유형의 다중 오버로드는 C++ iostream이 C의 stdio'scanf() '와 같은 형식 지정자에 대한 필요성을 피하는 방법입니다. 이것은 당신이 % s의 equavalent를 생각하고있을 때'scanf()'의 % c 형식 지정자와 같습니다. 'scanf()와 달리 그것은 확장 가능하다; 필요에 따라 고유 한 오버로드를 추가하여 다른 객체 클래스를 초기화 할 수 있습니다. – Clifford

0

키보드 입력이 cin >> buffer;에 의해 보이는 방식은 프로그램의 속성이 아니라 OS, 쉘, C 런타임 및 아마도 내가 잊은 천 가지의 조합으로 구성됩니다.

2

os 버퍼링에 대한 모든 대답은 사실이지만, 나는 혼란이 cinoperator >> (char)으로 추적 될 수 있다고 생각합니다. C++은 인수 유형에 따라 메서드를 오버로드 할 수 있기 때문에 전체 문자열이 버퍼링 되었더라도 operator >>의 char 버전은 한 번에 한 문자 만 할당합니다. 나는 operator >>가 당신의 특성으로 전체 끈을 두는 것을 시도해야 한 ㄴ다고 당신이 생각하고 있다는 것을 믿는다; 하지만 한 번에 한 글자를 읽는 것을 "알고"있기 때문에 한 번에 한 글자 만 할당합니다. 나는 이것이 cin을 위해 명시된 행동인지 아닌지는 잘 모르겠지만, 그런 일이 일어나고있는 것 같습니다.

관련 문제