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
'프로그래밍 > C 언어' 카테고리의 다른 글
동적 할당 ( 2. 동적 메모리 사용 및 해제 ) (0) | 2020.04.13 |
---|---|
동적 할당 ( 1. 동적 할당이란? ) (0) | 2020.04.01 |
문자와 문자열 ( 1. 문자열이란? ) (0) | 2020.03.09 |
포인터 ( 4. 함수와 포인터 ) (0) | 2020.03.02 |
포인터 ( 3. 포인터 연산 ) (0) | 2020.02.28 |