그냥저냥

[C] 문자와 문자열 처리 함수 본문

공부/이것저것

[C] 문자와 문자열 처리 함수

오양J 2017. 9. 25. 02:21

21. 문자와 문자열 처리 함수



21-1 스트림과 데이터의 전송


1] 입ㆍ출력에 대한 이해

- 입력: 실행 중인 프로그램이 데이터를 받아들이는 것.

- 출력: 실행 중인 프로그램이 데이터를 보내는 것.


2] 입ㆍ출력이 가능한 이유?

 프로그램과 모니터, 키보드 등은 동떨어진 개체이다. 이들을 연결하는 다리 역할을 하는 것이 스트림(stream)이다.

정확하게는 스트림(stream)은 연속된 데이터의 열(line)이지만 간단하게 다리라 생각하여도 괜찮다.

 파일 입ㆍ출력시에는 우리가 스트림 생성에 관여해야 되지만, 콘솔 입ㆍ출력에 쓰이는 스트림은 프로그램 실행시 자동으로 생성된다. 이때 기본적으로 제공되는 스트림은 'stdin', 'stdout', 'stderr'가 있다.


21-2 문자 단위 입ㆍ출력 함수


1] 문자 출력 함수

int putchar (int c) : 인자로 전달된 문자를 'stdout'으로 출력해 주는 함수.

int fputc (int c, FILE* stream) :  putchar()와 같은 역할을 하고 문자를 출력할 스트림을 지정할 수 있다.


2] 문자 입력 함수

int getchat (int c) : 'stdin'으로부터 한 문자를 입력받아서 반환해 주는 함수.

int fgetc (int c, FILE* stream) : 문자를 입력받을 스트림을 지정할 수 있다.


3] EOF에 대해서

 오류 발생 혹은 파일의 끝에 도달했을 경우 EOF를 리턴한다고 선언된 함수들이 있다.

이때 말하는 EOF의 실제 값은 '-1'이다.

fgetc나 getchar 함수가 파일의 끝에 도달하는 경우에도 EOF가 반환된다.


4] 문자 단위 입ㆍ출력 함수가 존재하는 이유

 입ㆍ출력 할 형식이 하나의 문자인 경우 이 함수가 효율적이다.


21-3 문자열 단위 입ㆍ출력 함수


1] 문자열 출력 함수

int puts (const char* s) : 'stdout'으로 문자열을 출력하는 함수, 문자열을 출력하고 자동으로 줄을 바꿔준다.

int fputs (const char* s, FILE* stream) : 문자열을 출력하고 자동으로 줄을 바꿔주지 않는다.


2] 문자열 입력 함수

char* gets (char* s) : 입력 받을 문자열을 저장하기 위한 배열을 선언한 다음, 배열의 시작 주소를 인자로             전달하면서 gets 함수를 호출하게 되면, 'stdin'으로부터 데이터를 입력 받는다. 잠재적 문제 존재 사용 자제.

char* fgets (char* s, int n, FILE* stream) : n은 입력받을 수 있는 최대 문자열의 길이를             의미한다.overflow의 위험이 없다.


21-4 표준 입ㆍ출력과 버퍼 (Buffer)


1] 표준 입ㆍ출력 기반의 버퍼

 표준 입ㆍ출력 함수를 사용하는 경우에는 버퍼라는 것을 제공받게 된다. 여기서 말하는 버퍼는 '여분의 임시 메모리 공간'이라고 생각하면 된다. 

 키보드를 통해 입력하는 데이터는 실행중인 프로그램으로 바로 읽혀지는 것이 아니라, 일단 입력 버퍼라는 곳에 저장된다. 그러고 나서 입력 버퍼에 존재하는 데이터가 프로그램으로 이동하는 것이다.

 프로그램상에서 printf와 같은 함수 호출을 통해서 모니터에 데이터를 출력하려는 경우에도 바로 출력이 이뤄지는 것이 아니라, 일단은 출력 버퍼라는 곳에 저장 되었다가 출력 스트림을 통해 모니터로 전송된다.

 키보드로부터 입력된 데이터가 입력 스트림을 거쳐 입력 버퍼로 들어가는 시점은 Enter키를 누르는 시점이다. Enter키를 누르기 전까지는 입력 버퍼가 비어 있다.


2] 버퍼링(Buffering)을 하는 이유는 무엇인가?

 버퍼링이란 데이터를 전송할 때, 중간에 버퍼(여분의 임시 저장소)를 둬서 전송하고자 하는 데이터를 임시 저장해 두는 것을 말한다. 이러한 버퍼링을 하는 이유는 성능 향상을 하기 위해서이다. 이러한 데이터 전송 작업 (I/O작업)은 컴퓨터가 처리해야 하는 많은 일들과 비교해서 상대적으로 중요도가 떨어지는 작업들이다. 따라서 어느정도 쌓아두고 한꺼번에 처리하는 것이 일을 효율적으로 처리하는 것이다.


3] 버퍼를 비우는 작업을 하는 fflush 함수


int fflush (FILE* stream)

 

 fflush 함수는 버퍼를 비우는 작엄을 하는 함수이다. fflush 함수의 인자로 전달되는 스트림의 버퍼를 비워버린다.

stdin과 같은 입력 스트림이 전달되면 입력 버퍼 안에 존재하는 데이터들은 모두 버려지게 된다(지워지게 된다). 그러나 stdout과 같은 출력 스트림이 인자로 전달되면 출력 버퍼 안에 존재하는 데이터들은 목적지를 향해서 출발하게 된다.(즉시 출력이 이뤄진다).


21-5 문자열 조작 함수


1] 문자열의 길이를 반환하는 strlen 함수


size_t strlen (const char* s)


※ size_t는 다음과 같은 선언 중 하나를 통해서 부호 없는 정수형으로 선언되어 있다.

typedef unsigned int size_t;

typedef unsigned long size_t;

typedef unsigned long long size_t;


2] 문자열울 복사하는 strcpy와 strncpy 함수


char* strcpy (char* dest, const char* src)            → Overflow 발생가능

char* strncpy (char* dest, const char* src, size_t n) 


3] 문자열을 추가하는 strcat과 strncat 함수


char* strcat (char* dest, const char* src)            →Overflow 발생가능

char* strncat (char* dest, const char* src, size_t n) 


4] 문자열을 비교하는 strcmp 그리고 strncmp 함수


int strcmp (const char* s1, const char* s2)

int strncmp (const char* s1, const char* s2, size_t n)


 비교는 사전상 먼저 오는 단어가 작다라고 판단한다. 문자열을 아스키코드로 변환하여 비교한다.

 0 보다 큰 값 (양수) 

 str1이 str2보다 큰 경우 

 0

 str1과 str2가 완전히 같은 경우

 0 보다 작은 값 (음수)

 str1이 str2보다 작은 경우


5] 문자열을 숫자로 변환하는 함수들


#include <stdlib.h>


int atoi (char *ptr);          //문자열을 int형 데이터로 변환

long atol (char *ptr);         //문자열을 lond형 데이터로 변환

double atof (char *ptr);       //문자열을 double형 데이터로 변환



 

'공부 > 이것저것' 카테고리의 다른 글

[C/C++] Standard library header <bitset>  (0) 2017.09.21
[C++] Conatiner Class  (0) 2017.02.10
[C++] 템플릿 (Template)  (0) 2017.01.23
Tistory에 소스 코드 넣기(SyntaxHighlighter 사용법)  (0) 2017.01.23
Comments