Programming/C C++
C에는 한문자를 입출력할때 getchar, putchar함수를 그리고 한문장을 입출력할때는 gets, puts함수를 사용하였습니다.

C++에서는 대부분의 경우 cin이나 cout로 <<, >>를 통해 입력과 출력을 처리하지만 C와 비슷하게 함수를 사용할 수도 있습니다.

#include <iostream.h>

main()
{
  char c;
 
  while(cin.get(c)){
    cout.put(c);
  }
 
  return 0;
}


cin이나 cout는 Class에 의해 파생된 일종의 Object 입니다. 위 Program에서는 이 Object의 get함수와 put함수를 사용해 한문자씩 입출력하고 있습니다.

C에서는 한문자입출력시 변수의 Data형으로 되도록 이면 int형을 사용하는것이 좋다고 하였는데 이는 getchar함수가 입력중지시 -값을 반환하도록 되어 있기 때문입니다.(변수가 이 반환값을 받습니다.)

하지만 위에서 쓰인 get함수는 해당 변수의 값을 함수의 반환값으로 받는것이 아니라 인수로 처리하기 때문에 오류판단여부는 get함수가 반환하는 값으로 처리할 수 있습니다. 따라서 굳이 int형으로 해둘 필요는 없는 것입니다.

문자처리 말고도 cin의 get함수는 문자가 아닌 문자열도 처리할 수 있습니다.

#include <iostream.h>

main()
{
  char s[10];
 
  cin.get(s, 10);
  cout << s << endl;
  
  return 0;
}


get으로 문자열을 처리할때는 두번째 인수에 입력될 해당 문자열의 수를 지정해 줘야 합니다. 떠힌 get으로 문자열을 입력받을때는 개발자가 특정 문자를 지정하여 해당 문자가 발견되면 처리를 중지하도록 할 수 도 있습니다.

#include <iostream.h>

main()
{
  char s[10];
 
  cin.get(s, 10, 'f');
  cout << s << endl;
   
  return 0;
}


get으로 문자열을 처리할때 문자 f 를 만나면 처리를 중지하도록 합니다.

만일 세번째 인수에 중지문자를 지정해 주지 않으면 자동으로 문자열의 종료를 의미하는 0(\0)문자가 지정됩니다.(기본값)

그런데 get을 사용시에는 한가지 문제가 있습니다. 그것은 입력종료문자를 만나 처리가 중지된 이후에는 더이상 입력처리를 행하지 않는다는 것입니다. 이는 읽혀진 종료문자를 처리가 끝난 후에도 여전히 가지고 있기 때문입니다.

#include <iostream.h>

main()
{
  char s[10];
 
  cin.get(s, 10);
  cout << s << endl;
 
  cin.get(s, 10);
  cout << s << endl;
 
  cin.get(s, 10);
  cout << s << endl;
   
  return 0;
}


get을 통해 3번의 입력과 출력을 시도하고 있습니다.

즉, get이 한번 동작하여 \0 문자를 만나 처리가 중지된 이 후 get함수는 이 문자를 여전히 가지고 있기 때문에 이 후 한번더 동작을 지시하게 되면 바로 \0문자를 만나 처리가 진행되지 않는 것입니다.

이 문제를 해결하려면 cin의 getline함수를 사용해야 합니다. getline함수는 문자열을 처리하는 기본함수인데 사용법은 get함수와 완전히 동일합니다. 다만 두 함수의 차이점은 단지 종료문자를 가지느냐 그렇지 않느냐 하는것 뿐입니다. (getline는 종료문자를 읽으면 그 때의 처리에만 적용할뿐 이 후에는 더이상 가지지 않습니다.)

#include <iostream.h>

main()
{
  char s[10];
 
  cin.getline(s, 10);
  cout << s << endl;
 
  cin.getline(s, 10);
  cout << s << endl;
 
  cin.getline(s, 10);
  cout << s << endl;
   
  return 0;
}

'Programming > C C++' 카테고리의 다른 글

[C, C++] 비트필드(Bit Field)  (1) 2010.04.27
[C, C++] 표준 Library 함수 - 문자열 비교 함수  (0) 2010.04.22
[C, C++] 문자와 문자열 처리(cin Object)  (0) 2010.04.16
[C, C++] Memory동적 확보  (0) 2010.04.15
[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
,
0 0