본문 바로가기
프로그래밍/C

4. C언어 (문자/문자열 입출력)

by Choraengyi 2017. 1. 13.
728x90

 C언어 문자, 문자 입출력에 대해 알아보겠습니다.


흔히 아는 scanf, printf 말고도 입출력 함수가 존재합니다. getchar와 putchar란 함수인데, getchar 같은 경우, 키보드로 입력받은 즉 input 값을 읽어오는 역할을 하고, putchar 는 읽어온 내용을 출력해 줍니다.


getchar는 한 문자만 가능합니다. 



 위의 소스를 보면 getchar 로 읽어들인 값을 c에 넣어주어서 putchar 로 c의 내용을 출력하는 것입니다. 



위 그림처럼 입력을 많이 해도 한문자만 읽어들이기 때문에 첫문자만 출력됩니다.


getchar에 한가지 덫붙이게 되면, 버퍼를 비워주는 역할도 수행하게 됩니다.


 버퍼는 읽어들일 값을 일정용량 쌓았다가 한꺼번에 읽는 기능을 제공하게 됩니다. 값이 있을때마다 일일이 바로 읽어들이지 않고 일정용량 쌓이면 읽어 들이기 때문에 메모리측면이나 CPU 측면의 과도한 접근을 줄여주게 됩니다.


실생활에 예를 들자면 우체국에서 편지가 접수될때마다 배송을 하는게 아니고 그날 거를 다모아서 한꺼번에 보내주는것으로 들 수 있습니다.


 버퍼를 비운다는 의미를 조금 더 이해하기 위해 scanf 함수를 들어서 설명하겠습니다. 


scanf 함수의 경우 많이 쓰이는 문자 입력 함수인데, 입력버퍼에 사용자의 입력을 받아, 개행문자가 있으면 더 이상의 입력이 없다고 판단하고 해당 변수에 입력값을 넘기게 됩니다.  입력값을 입력하게 될때 엔터를 치면 입력을 그만 받는 것은 그러한 이유 입니다.


 C언어에서 엔터는 \n 이라고 알려져 있습니다. 그렇다면,


scanf("%c",&a);


 와 같이 한문자를 입력받는 코드가 있다고 할때 만약 c 를 입력하고 엔터를 하게 되면, 버퍼에는 c\n이 들어가 있습니다. 


개행문자도 같이 버퍼에 쌓이게 됩니다. 코드를 하나 보면서 더 설명하겠습니다.



 위에 보면 scanf가 연속으로 두개가 있는데(한 문자를 읽어들이는) 두번째 scanf에서 문자열을 입력하지도 않았는데 멋대로 프로그램이 종료되었습니다. 


아까 이어서 말하자면 a를 입력하고 엔터를 해서 stdin 버퍼에 a\n 가 들어가게 됩니다. 그 다음 a문자를 변수 a에 넘겨주게 되면 입력한 a의 값은 없어지고, 버퍼에는 \n만 남게 됩니다. 


 그다음 다시 scanf로 버퍼에 접근하게 될때 \n 이 남아있어 개행문자로 인식하여 바로 종료가 되버리는 것입니다.


이를 해결하기 위하여 버퍼를 비워주는 방법이 있습니다.



 fflush(stdin) 명령은 해당 버퍼에 있는 내용을 비워주게 됩니다. 그러면서 정상적으로 2번째 scanf 도 수행되게 됩니다.


하지만 fflush 같은경우 특정 컴파일러에서 동작하고 일부 gcc 에서 동작하지 않는 경우가 많습니다.


위에서 언급하였듯이 getchar 를 이용하여 버퍼를 비워주는 방법이 있습니다.



 중간의 getchar 를 이용하여 \n을 읽어들여 버퍼를 비워주게 됩니다. 


물론 scanf로 한문자만 읽는 경우가 많지는 않지만, 버퍼의 대략적인 설명을 위하여 예를 들어 보았습니다.


 계속 넘어가서 getchar, putchar를 보겠습니다.


getchar 를 이용하여 문자열을 읽어 들일수가 있습니다. while 문과 함께 사용하면 문자열 읽어들이기가 가능해 집니다.



 while 문은 아직 설명한적이 없지만 반복문으로서 괄호안의 조건이 참이면 while문 안에있는 (body)문장을 조건이 거짓일때 까지 반복 수행하게 됩니다.


위의 코드를 분석하게되면 getchar로 입력값을 읽어들여, while문을 만나 조건을 검사하게 되는데, c!=EOF 에서 !의 경우 같지 않다는 말 입니다. 그뒤에 EOF는 End Of File 의 약자로서 텍스트의 끝을 의미하게 됩니다. 해석하면 c가 텍스트의 끝이 아닐경우 반복문을 계속 수행한다는 말입니다. 


반복문 body를 보게 되면 putchar로 c의 내용을 읽어들이고 getchar 로 버퍼에서 한글자를 읽어들여 없에 줍니다. 이를 EOF를 만날때까지 계속 반복하여 문자열을 출력할 수 가 있습니다. hello를 입력하면 버퍼에 hello\n 가 들어가게 되고, 한글자를 읽어 putchar로 h를 출력하고, getchar를 해서 ello\n 가남고, 다시 반복문으로가 e를 출력하고 llo\n가 남게되고 이러한 방식입니다.


getchar 함수와 putchar 함수를 이용하여 여러가지 활용도 가능합니다. 먼저 글자수 카운트를 해보았습니다.



 입력받은 수대로 카운트가 증가하는 코딩입니다. hello\n 해서 6개가 카운트 되었습니다. 참고로 count++ 의 경우 count의 값을 1증가 한다는 뜻입니다. count=count+1과 같은 문장입니다.


이어서 line 카운트도 가능합니다.


 개행문자인 \n을 만나게 되면 count가 증가해 줄갯수를 count 해주는 코딩입니다. 


다음은 단어갯수를 세는 코딩입니다.



 if 문장이 나오게 되었는데 이는 영어 뜻과 마찬가지로 만약에 라는 뜻으로 괄호안의 조건을 만족하면 if 문의 body 문장을 실행하게 됩니다. 위에서 보면 c가 '\n' 또는 '\t' 또는 ' ' 셋중 하나의 값이면 count가 1증가하게 된다는 뜻입니다. \t 의 경우 tab 개행문자입니다. 그리고 밑의 if 문에서는 입력값이 ~ 일경우 while 문을 종료하게 하였습니다. break는 반복문 loop를 빠져나온다는 뜻입니다.


실행결과 입니다.



 getchar와 putchar 함수에 대해 알아보았는데 전자사전을 만들거나 텍스트 파일에 대해 정리하고 count 할때 유용하게 쓰일 거 같습니다. 그 외에도 활용범위가 넓을거 같습니다.


 문자와 문자열 출력, 버퍼, 반복문과 조건문을 간단히 알아보았습니다.





728x90
반응형

'프로그래밍 > C' 카테고리의 다른 글

6. C언어 (사용자 정의 함수)  (0) 2017.01.19
5. C언어 (데이터)  (0) 2017.01.14
3. C언어 (상수)  (0) 2017.01.11
2. C언어 (변수)  (0) 2017.01.10
1. C언어 (hello world)  (0) 2017.01.05

댓글