2013-08-16 3 views
1

에 상응하는 C의"동안 (c = getchar가())"C++

while (c = getchar()) 

관용구 유사하다 C++ iostream 라이브러리를 사용하는 관용적 표현의 일종이 있는가?

참고 : 더 일반적인 것으로 허용하기 위해 간단히 "c = getchar()"문을 남겼습니다. 실제 코드에서는이 결과를 EOF 나 개행과 같은 다른 것으로 비교할 것입니다.

+6

while (std :: cin >> c)'. – Rapptz

+2

@Rapptz : 당신은'std :: cin >> std :: noskipws'를 잊었습니다. –

+0

@MooingDuck 죄송합니다. – Rapptz

답변

9
#include <iostream> 

int main() { 
    char c; 
    std::cin >> std::noskipws; 
    while(std::cin >> c) { 
     std::cout << c << std::endl; 
    } 
} 
+0

'noskipws'는 끈적 거리며 매번 설정할 필요가 없습니다. 또한 형식 지정 루틴을 사용하면 서식을 사용할 수 없으므로 시간이 낭비됩니다. 'std :: cin.get (c)'를 사용하십시오. – Potatoswatter

+0

@Potatoswatter 업데이트 됨! – andre

6

가장 가까운 당량) (getchar가하는 것은 std::istream::get()이다

while ((c = std::cin.get())) 

참고 소괄호; 루프 조건에서 == 대신 =을 사용하는 것에 대한 컴파일러 경고를 피하기 위해 사용됩니다.

+0

기다림, 방금 알아 챘습니다.이 코드는 잘못되었습니다! O.o 완전히 루프 종료 조건이 100 % 잘못되었다는 사실을 알지 못했습니다. 3 번처럼 첫 번째 답을 읽었습니다. (protip :'while (std :: cin.get (c))') –

+0

@MooingDuck 어떻게 잘못 되었습니까? istream :: get()의 오버로드를 사용하여 읽은 문자 또는 EOF를 반환합니다. 이것은 getchar()과 완전히 똑같은 의미입니다. 나는 다양한 오버로드를 볼 수있는 cplusplus.com의 istream :: get() 문서에 연결했습니다. 내가 사용하고있는 것은 "(1) 단일 문자"라고 표시된 것입니다. OP의 코드'while (c = getchar())'는 똑같은 의미론으로 * 정확하게 * while (c = std :: cin.get())으로 변환합니다. –

+0

더 자세히 살펴보면, 번역이 정확하고, 내가 본 버그는 OP 코드에도 있습니다. 내 잘못이야. 나는 downvote를 제거 할 수 있도록 게시물에 작은 편집을 할 것입니다. –

0

주 : "() C = getchar가"더 일반적인 될 수 있도록 단순히에 문을 떠났다. 실제 코드에서는이 결과를 EOF 나 개행과 같은 다른 것으로 비교할 것입니다.

음, 그게 덜. 일반 버전이라면 일반적인 오류를 일반적으로 나타냅니다. 모두 소프트웨어는 EOF 조건 을 처리해야합니다..

C++에서는 성공에 따라 참 또는 거짓 값으로 비교되는 스트림 버퍼를 사용합니다. 가짜 스트림 값으로 EOF를 사용할 필요는 없지만 선택할 수는 있습니다.

관용구 (산세 버그)는 빈 줄을 사용하여 파일을 종료 할 수없는 요구 사항, 다음 줄 바꿈까지 소비하고 반복 당 한 줄을 구문 분석 할 경우,

while (std::cin.get(c)) 

수 사용합니다

std::string s; 
while (getline(std::cin, s)) { 
    std::istringstream line(s); 

그러면 line >> x을 사용하여 항목을 추출 할 수 있습니다.

관련 문제