Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[877] 다릅니다!
김백일 [cedar] 1884 읽음    2002-07-15 16:58
김경래 님이 쓰신 글 :
: 제가 C를 배울때는
: 문자열을 입력받을때
: A란 버퍼에 문자열을 잡아넣을려면
: gets(a);
: 이렇게 하면됬던걸로 알구있는데요
: c++에서는 cin>>a;
: 그냥 이렇게 써주면 끝인가요??
: 혼란이--;;
: 죄송합니다.
: 고수님 부탁합니다.
: 비가 오지만... 즐거운 하루되세요

  char buf[MAX_LENGTH];
일때, C++의
  cin >> buf;
는 C에서는
  scanf("%s", buf);
가 됩니다.
즉, 공백 문자를 만나면 입력이 중단됩니다.

C의
  gets(buf);
는 공백 문자를 포함하고 '\n'을 만나면 입력이 중단됩니다.
그런데 이 함수는 심각한 문제점이 있습니다.
한 줄의 길이가 MAX_LENGTH 를 초과하면,
할당한 메모리 영역을 넘어가서 쓰기를 하므로 매우 위험합니다.
  gets(buf);
대신에
  fgets(buf, MAX_LENGTH, stdin);
를 쓰실 것을 권합니다.
한 줄의 길이가 MAX_LENGTH 이상의 입력을 받으면
거기까지만 입력 받고 입력을 중단합니다.

C++에서 fgets()와 유사한 멤버 함수는,
  cin.get(buf, MAX_LENGTH);
또는
  cin.getline(buf, MAX_LENGTH);
가 있습니다.

두 메소드는 동작에 약간 차이가 있습니다.
(cin.getline()이 코딩이 간단하지만,
cin.get() 은 좀 더 자세한 제어를 할 수 있습니다.)
자세한 설명은 여기서는 생략합니다.
도움말과 C++ 관련 책을 참고하세요.

참고로 C++에서는 char 배열로 문자열을 다루는 불편한 방식 대신
ANSI C++ 라이브러리에서 제공하는 string 클래스를 사용하면
문자열을 다루는 것이 매우 편리합니다.

string의 경우는 멤버 함수 cin.getline()이 아니라,
일반 함수 getline()을 사용합니다.
예제는 다음과 같습니다.

  string line;
  while (getline(cin, line))
     cout << line << endl;

하여튼 char 배열대신 string 클래스를 쓰실 것을 강추합니다!


+ -

관련 글 리스트
876 cin <- 궁금해용 김경래 1712 2002/07/15
877     다릅니다! 김백일 1884 2002/07/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.