2011-02-02 3 views
21

나는 그것이 전체 라인을 얻기보다는 공백에서 멈 춥니 다 잊었 때문에두 개의 다른 getline() 함수가있는 이유는 무엇입니까?

std::string s; 
cin >> s; 

내가 나 자신을 저주 C++ 코드 라인의 빠른 조각을 할 때마다.

다음은 getline 기억에, 나는 변함없이 두 품종으로 혼동 :

std::string s; 
getline (std::cin, s); 

과 :

char cs[256]; 
std::cin.getline (cs, sizeof (cs)); 

실제로 데이터 형식이 아닌이 둘 사이에 차이가 있습니까?

저는 C++ 방식이 전자가되어야한다고 생각합니다. 어떤 상황에서 나는 아마 후자를 사용할 것인가? 어쨌든 null-terminated 문자 배열 대신에 실제 문자열을 사용해야 할 것입니다.

입력이 실제로 입력 스트림의 범위 여야하므로 이전 부분이 istream 인 이유는 무엇입니까?

답변

8

스탠다드 라이브러리는 IOStream, String, STL과 함께 Cyser와 C 헤더로 구성되어 있습니다.

느슨하게 커플 링 된 부분이 이상하게 보이지 않습니다 (실제로는 그렇지 않더라도 좋겠지 만).

기타 부작용에는 std::string::lengthstd::string::size이 있으며, 후자는 STL과의 인터페이스 호환성을 위해 추가되었으며 이전 버전은 이전 코드와의 호환성을 위해 보존되었습니다.

+3

나는이 문구가 "느슨하게 결합"되어 있다고 생각한다. "제대로 통합되지 않았다"는 부정적인 의미가있다. std :: string을 사용하지 않고'std :: istream'을 사용하지 않고'std :: istream'을 사용할 수 있다는 것이 좋은 일이라고 생각합니다. –

+2

@Charles : "제출"을하기 전에 정확한 반대의 변화를했다고 말하면 저를 믿으시겠습니까?) 필자는 개인적으로보다 "균일 한"표준 라이브러리를 선호 할 것입니다. C++ 표준 라이브러리는 "유기적 성장"의 전형입니다. –

+2

@Charles : iostream과 문자열이 결합되어 있지 않은 것은 틀림 없다고 생각합니다. iostream은 기본 수준에서 문자열 조작에 의존합니다. 종속성을 줄이는 것은 문자열 클래스가 아닌 경우 C 문자열로 작업하는 멤버 함수를 사용할 수 없다는 것을 제공하는 것입니다. – Puppy

1

iostreams 라이브러리 내의 getline 변형은 문자열을 대상으로 지원하지 않으므로 문자열 라이브러리는 변형을 정의합니다.

22

글로벌 getline() 함수는 C++ std::string 개체에서 작동합니다.

istream::getline() 메서드는 "classic"C 문자열 (char에 대한 포인터)과 함께 작동합니다.

+0

그래서 입력하는 것은 문자열 일 뿐이며 세상의 아름다운 'object.method()'뷰를 깨뜨리는 대신's.getline (std :: cin)'이 아닌 이유는 무엇입니까? – paxdiablo

+3

@paxdiablo, 그것은 의미론의 문제 일 수 있습니다.'getline()'은 문자열 연산이 아니므로'std :: string' 클래스의 메소드로 만드는 것이 이상합니다. –

+4

내 생각 엔 에 대해 알지 못하므로 std :: cin은 std :: string을 반환하는 메서드를 가질 수 없습니다. – Grozz

1

예 현대 C++ 방법은 자유 함수를 사용하고 std :: string을 입력하는 것입니다.

그러나 IOStream은 std :: string보다 훨씬 긴 역사가 있습니다 (표준 버전은 최소한 동일한 디자인의 세 번째 화신입니다). 그리고 역사는 왜 그런지를 설명합니다.

(getline 멤버는 동적 할당을 의미하지 않는다는 장점이 있는데, 그 특성은 시간에 편리 할 수 ​​있지만 스크래치 설계에서 정당화하기에 충분하지 않을 수 있음).

6

일반적인 인터페이스 디자인 문제입니다. cin.getline()은 요청을하는 자연스러운 방법이지만 스트림 코드를 <string>에 종속시키지 않으려면 cin.getline(std::string&) 기능을 제공 할 수 없습니다. 독립형 getline(cin, s)은 문자열이 범위에 포함되면 나중에 추가 할 수 있습니다. 어쨌든 #include에 아무 것도 없기 때문에 char*의 문제는 아닙니다.

언어가 나중에 코드가 기존 클래스 (예 : Ruby)에 추가 기능을 추가 할 수있게 해주는 것이 좋지만, 다른 방법으로는 델타 커 레이션이 물리고 잘 유지 보수 가능성이 떨어집니다. 물론 최소한의 멤버 함수와 많은 독립적 인 함수에 대한 대중적인 논쟁이 있습니다. 개인적으로는 인터페이스가 덜 직관적이고 표현력이 떨어지도록해야하지만 개인적으로는 인터페이스를 사용하지 말아야한다고 생각합니다.

+0

이것은 왜이 디커플링이 의도적으로 설계되었는지를 명시하는 유일한 대답 인 것 같습니다. 'string'이'iostream'보다 새로운 것이라는 단순한 사실은, 결국 왜 후자가 왜 개조되지 않았는가에 대한 충분한 설명이 아닙니다. 결정이 논쟁의 여지가 적고 사용되지 않은'문자열 '클래스를 갖는 오버 헤드가 비교적 큰 시간이 있다고 가정합니다. –

관련 문제