|
김경래 님이 쓰신 글 :
: 제가 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 클래스를 쓰실 것을 강추합니다!
|