프로그래밍/C 언어

문자와 문자열 ( 2. 문자열의 배열 및 처리 함수)

Jay_rock 2020. 3. 13. 01:34

1. 문자열의 배열

여러 개의 문자열을 처리하는 방법은 세 가지가 있다.

 

첫 번째는 가장 간단한 방법으로 배열을 여러 개 사용하는 방법이다.

char num0[5] = "zero";
char num1[5] = "one";
char num2[5] = "two";

printf("%s\n%s\n%s",num0,num1,num2);

 

두 번째 방법은 문자 배열이 많은 경우에는 2차원 문자 배열을 사용하는 것이다.

char num[3][5] = {"zero", "one", "two"};

for(int i=0; i<3 ; i++){
	printf("%s\n",num[i]);
}

 

마지막으로 문자형 포인터 배열을 이용하여 여러 문자열을 효율적으로 처리할 수 있다.

char *pnum[3] = {"zero","one","two"};

for(int i = 0; i < 3; i++){
	printf("%s\n",pnum[i]);
}

 

3개 코드의 실행결과는 모두 같다.

 

 

2. 문자(열) 처리 함수

1) 문자 처리 함수

문자와 문자열의 관련된 기본적인 연산들은 모두 라이브러리 함수로 지원된다. 먼저 문자를 입출력하는 함수부터 보면 다음과 같다.

 

입출력함수 설명
int getchar(void)

하나의 문자를 읽어서 반환한다. ( 버퍼 사용 : 엔터키를 눌러 입력됨 )

void putchar(int c) 변수 c에 저장된 문자를 출력한다.

int getch(void) 또는 int _getch(void)

하나의 문자를 읽어서 반환한다. ( 버퍼 사용 x )
void putch(int c) 또는 void _putch(int c) 변수 c에 저장된 문자를 출력한다. ( 버퍼 사용 x )
scanf("%c", &c ) 하나의 문자를 읽어서 변수 c에 저장한다.
printf("%c", c) 변수 c에 저장된 문자를 출력한다.

 

더보기

<참고>

getchar()와 putchar()를 이용하여 사용하여 입출력하는 예이다.

#include<stdio.h>

int main(){
    int ch;
    while((ch = getchar()) != EOF)
    	putchar(ch);
    return 0;
}

입력 끝에 EOF(end of file) 문자를 사용하는 이유는 문자를 입력받아 EOF가 아니면 putchar()를 이용하여 화면에 출력하기 위함이다. getchar()와 putchar() 대신 getch() ( 또는 _getch() )와 putch() ( 또는 _putch() ) 함수를 사용할 수 있다. 그 대신 두 함수를 사용하려면 <conio.h>를 포함해야 한다.

 

 

문자를 처리하는 함수는 크게 문자들을 검사하거나 문자를 변환하는 함수로 나뉜다. 먼저 검사 함수는 앞이 is로 시작된다. 검사 결과가 참이면 0을, 거짓이면 1을 반환한다.

 

함수 설명
int isalpha( int c ) c가 영문자인가?
int issupper( int c ), int islower( int c ) c가 대문자인가?, 소문자인가?
int isdigit( int c ), int isnum( int c ) c가 숫자인가?, 영문자 혹은 숫자인가?
int isxdigit( int c ) c가 16진수 숫자인가?
int isspace( int c ) c가 공백문자인가? (ex ' ', '\n', '\t', '\v', '\r' )
int ispunct( int c ) c가 구두점 문자인가?
int isprint( int c ) c가 출력 가능한 문자인가?
int iscntrl( int c ) c가 제어문자인가?
int isascii( int c ) c가 아스키 코드인가?

 

두 번째로 변환하는 함수는 함수가 to로 시작한다. 대문자를 소문자로 바꾸거나, 문자를 아스키코드로 바꾸는 작업을 수행한다.

 

함수 설명
int toupper( int c )

c를 대문자로 바꾼다.

int tolower( int c ) c를 소문자로 바꾼다.
int toascii( int c ) c를 아스키 코드로 바꾼다.

 

2) 문자열 처리 함수

문자열은 문자와 다르게 다루기가 힘들다. 그래서 문자열을 쉽게 처리하기 위해 헤더 파일에 <string.h>를 포함하여 다양한 라이브러리 함수를 이용한다. 먼저 입출력 함수들은 다음과 같다.

 

입출력함수 설명
int scanf("%s", s) 문자열을 읽어서 문자 배열 s[]에 저장한다.
int printf("%s",s) 배열 s[]에 저장된 문자열을 출력한다.
char *gets(char *s) 한 줄의 문자열을 읽어서 문자 배열 s[]에 저장한다.
int puts(const char *s) 배열 s[]에 저장되어 있는 한 줄의 문자열을 출력한다.

 

scanf() 함수를 사용하면 하나의 단어밖에 입력받지 못하지만, gets() 함수를 사용하면 한 줄 전체를 입력받을 수 있다. gets() 함수는 키보드로 엔터를 입력받기 전까지의 문자열을 입력받는다. 

 

또한 문자열을 처리하는 함수들 중에는 두 개의 문자열을 붙이거나 두 개의 문자열을 비교하고, 문자열의 길이를 구하는 등의 작업을 수행하는 것들이 있다. 이러한 문자열 관련 함수들은 string.h에 선언되어있기 때문에 <string.h>을 포함시켜야 한다. 다음은 문자열 처리 함수들이다.

 

함수 설명
atoi(s), atol(s), atof(s) 문자열 s를 각각 int, long, float 형으로 변환한다.
strlen(s) 문자열 s의 길이를 구한다.
strchr(s, c) 문자열 s에서 문자 c가 처음 나타난 위치를 반환한다.
strcat(s1, s2), 문자열 s2를 s1끝에 붙인다.
strcpy(s1, s2) 문자열 s2를 s1에 복사한다.
strcmp(s1, s2) 문자열 s1과 s2를 비교한다.
strstr(s1, s2) 문자열 s1에서 문자열 s2를 찾는다.
char *strtok(s, delimit) 문자열 s를 구분자(delmit)를 이용하여 토큰으로 분리한다.

 

여기서 strcmp(s1, s2)의 결과값은 s1이 s2보다 사전에서 먼저 나오면 -1 (음수), 같으면 0, s2가 s1보다 먼저 나오면 1(양수) 값이 반환된다. strtok() 함수는 사용자가 원하는 구분자를 이용하여 문자열을 여러 개 의 토큰으로 분리할 수 있다. 여기서 토큰은 더 이상 나눌 수 없는 기본적인 언어 요소를 의미한다.

 

 

더보기

strtok() 함수의 사용 예시

char str[] = "Hello World" ;
char deli[] = " ,\t\n";        // 구분자는 스페이스 문자, 쉼표, 탭문자, 줄바꿈 문자이다.
char *token;

token = strtok(str, deli);

while(token != NULL){
    printf("token: %s\n", token);
    token = strok(NULL, deli); // 다음 토큰을 얻으려면 NULL을 인수로 준다.
}

실행 결과

Hello

World