2011-10-25 5 views
1

이것은 내 첫 번째 C++ 프로그램입니다. 입력 된 단어 수를 인쇄합니다.이 프로그램의 작동 방식

첫 번째 질문은 루프에 들어가서 카운트에 어떻게 추가됩니까? 내가 공백 문자를 입력 할 때마다 그것입니까? 그렇다면 단어를 셀 수 있다는 것을 어떻게 알 수 있습니까?

using namespace std; 

int main() { 
    int count; 
    string s; 
    count = 0; 
    while (cin >> s) 
     count++; 
    cout << count << '\n'; 
    return 0; 
} 

내 두 번째 질문. 다른 사람이 네임 스페이스 std가 초보자에게 어떤 의미인지 설명 할 수 있습니까?

답변

2
  1. 혓바닥에 공백이 될 때까지 입력을 사로 잡을 것, 예. 루프의 특정 스타일은 EOF (End Of File)가 발견되거나 잘못된 입력이 제공 될 때까지 계속됩니다. 그 루프는 일반적인 C++ 연습처럼 보이지 않지만, here으로 묘사되어 있습니다.

2. namespace std은 코드에서 참조하는 개체를 찾는 위치를 컴파일러에게 알려주는 방법입니다. 서로 다른 객체가 다른 네임 스페이스의 "내부"이기 때문에 컴파일러에게 (구체적으로 std :: cin으로) 컴파일러에게 알려 주거나 사용하는 객체가 미래에있을 편리 성 (예 : using namespace std)을 말해야합니다.

+0

사실 두 가지 공통점이 있습니다. 하나는 그가 보여 주듯이, 다른 하나는 EOF 또는 다른 오류가 조기에 발생하면 비참하게 실패합니다. –

7

cin >> string을 할 때. 단어를 읽고 문자열에 넣습니다. 예, 구분 기호에 도달 할 때까지 char로 char을 읽습니다.

표준 표준을 의미합니다. 표준 C++ 라이브러리는 std 네임 스페이스 안에 있습니다. 당신은 네임 스페이스 표준를 사용하여 없이 다시 작성하거나 코드 수 :

int main() { 
    int count; 
    std::string s; 
    count = 0; 
    while (std::cin >> s) 
     count++; 
    std::cout << count << '\n'; 
    return 0; 
} 

나는 초보자는 무슨 일이 일어나고 있는지 이해하기 어렵습니다 때문에 네임 스페이스 표준 문을 사용하여 사용하는 것이 억제.

+0

그리고'set'은 불행하게도 일반적으로 사용되는 이름입니다. –

2

코드에서 cin >> s은 입력 스트림에서 std::string을 읽으려고합니다. 시도가 성공하면 cin >> s의 반환 값은 암시 적으로 true으로 변환되고 while 루프는 계속 증가하여 카운터를 증가시킵니다. 그렇지 않으면 입력 스트림에서 읽을 데이터가 더 이상 없으므로 시도가 실패하면 while 루프가 종료됩니다.

당신은 다음과 같이 말씀을 계산하는 std::distance를 사용할 수 있습니다

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <string> 

int main() { 
     std::istream_iterator<std::string> begin(std::cin), end; 
     size_t count = std::distance(begin, end); 
     std::cout << count << std::endl;   
     return 0; 
} 

데모 :이 코드에서 http://www.ideone.com/Hldz3

, 당신은 std::distance 기능을 모두 통과, 두 반복자 beginend을 만들 수 있습니다. 이 함수는 beginend 사이의 거리를 계산합니다. 거리는 입력 스트림의 문자열 수에 불과합니다. 반복자 begin은 입력 스트림에서 오는 문자열을 반복하며, 은 반복자의 끝을 정의합니다. 여기서 begin은 반복을 중지합니다. std::istream_iterator에 템플릿 인수가 std::string 때문에 문자열을 통해 begin 반복이 이유는 : 당신이 char로 변경하는 경우

std::istream_iterator<std::string> begin(std::cin), end; 
        //^^^^^^^^^^^ 

, 다음 begin 다음과 같은 프로그램의 문자 수를 계산합니다 의미 이상 char 반복자합니다 입력 스트림 :

#include <iostream> 
#include <algorithm> 
#include <iterator> 

int main() { 
     std::istream_iterator<char> begin(std::cin), end; 
     size_t count = std::distance(begin, end); 
     std::cout << count << std::endl;   
     return 0; 
} 

데모 : http://www.ideone.com/NH52y

심 마찬가지로 <iterator> 헤더의 이터레이터와 <algorithm> 헤더의 일반 함수를 사용하면 많은 멋진 작업을 수행 할 수 있습니다.

예를 들어, 입력 스트림에서 줄 수를 계산하려고한다고 가정 해 보겠습니다. 그렇다면 위 프로그램을 통해 어떤 변화가 생길 것입니까?문자 수를 계산할 때 std::stringchar으로 변경하는 방법은 즉시 line (char 대신)을 반복 할 수 있도록이 값을 line으로 변경해야한다고 제안합니다. 표준 라이브러리에 존재하지

클래스 line 더, 우리는 하나의 자신, 을 정의했습니다하지만 흥미로운 점은 아래 그림과 같이 우리가 전체 작업 코드와 함께, 그것을 빈을 유지할 수 있다는 것입니다 :

#include <iostream> 
#include <algorithm> 
#include <iterator> 
#include <string> 

struct line {}; //Interesting part! 

std::istream& operator >>(std::istream & in, line &) 
{ 
    std::string s; 
    return std::getline(in, s); 
} 

int main() { 
     std::istream_iterator<line> begin(std::cin), end; 
     size_t count = std::distance(begin, end); 
     std::cout << count << std::endl;   
     return 0; 
} 

예, line과 함께 line에 대해서도 operator>>을 정의해야합니다. 그것은 std::istream_terator<line> 클래스에서 사용됩니다.

데모 : http://www.ideone.com/iKPA6