문자 / 문자열 처리 함수

이지우·2022년 10월 12일
0

C언어

목록 보기
12/17

문자 처리 함수

검사하는 함수

함수설명
isalpha(c)c가 영문자인가?(a-z, A-Z)
isupper(c)c가 대문자인가?(A-Z)
islower(c)c가 소문자인가?(a-z)
isdigit(c)c가 숫자인가?(0-9)
isalnum(c)c가 영문자이나 숫자인가?(a-z, A-Z, 0-9)
isxdigit(c)c가 16진수의 숫자인가?(0-9, A-F, a-f)
isspace(c)c가 공백문자인가?(‘ ’, ‘\n', '\t', '\v', '\r')
ispunct(c)c가 구두점 문자인가?
isprint(c)C가 출력가능한 문자인가?
iscntrl(c)c가 제어 문자인가?
isascii(c)c가 아스키 코드인가?

변환하는 함수

함수설명
toupper(c)c를 대문자로 바꾼다.
tolower(c)c를 소문자로 바꾼다.
toascii(c)c를 아스키 코드로 바꾼다.

예제

소문자이면 대문자로 변환하고 문자를 출력하는 예제

#include <stdio.h>
#include <ctype.h>

int main() {
	int c;
	while((c = getchar()) != EOF) {
		if(islower(c))
			c = toupper(c);
	putchar(c);
}

문자열 처리 함수

string.h 헤더 추가해야한다.

함수설명
strlen(s)문자열 s의 길이를 구한다.
strcpy(s1, s2)s2를 s1에 복사한다.
strcat(s1, s2)s2를 s1의 끝에 붙여넣는다.
strcmp(s1, s2)s1과 s2를 비교한다.
strncpy(s1, s2, n)s2의 최대 n개의 문자를 s1에 복사한다.
strncat(s1, s2, n)s2의 최대 n개의 문자를 s1의 끝에 붙여넣는다.
strncmp(s1, s2, n)최대 n개의 문자까지 s1과 s2를 비교한다.
strchr(s, c)문자열 s안에서 문자 c를 찾는다.
strstr(s1, s2)문자열 s1에서 문자열 s2를 찾는다.

문자열 길이 계산 strlen 함수

배열의 크기와 배열에 저장된 문자열의 길이는 다를 수 있다.
strlen 함수는 배열에 저장된 문자열의 길이를 구해 반환한다.

ex) 두 문자열 중 길이가 긴 단어 출력

#include <stdio.h>
#include <string.h>

int main() {
	char str1[50], str2[50];
    char *resp;				// 문자열이 긴 배열을 선택할 포인터
    
	printf("2개의 과일 이름 입력 : ");
    scanf("%s%s", st1, str2);
    
    // 배열에 저장된 문자열 길이 비교
    if(strlen(str1) > strlen(str2))
    	resp = str1;
    else
    	resp = str2;
    
    printf("이름이 긴 과일은 : %s\n", resp);
}

문자열 복사 strcpy() 함수

char 배열은 문자열로 초기화 한 뒤 다른 문자열로 바꾸기 위해서는 한 문자씩 바꾸는 번거로운 작업을 해야한다.

strcpy 함수를 사용하면 char 배열에 문자열을 복사하는 대입 연산을 수행할 수 있다.

#include <stdio.h>
#include <string.h>		// strcpy 함수 사용위해 필요함

int main() {
	char str1[30] = "strawberry";
    char str2[30] = "apple";
    char *ps1 = "banana";		// 포인터로 문자열 상수 연결
    char *ps2 = str2;			// 포인터로 배열 연결
    
    printf("최초 문자열 : %s\n", str1);
    strcpy(str1, str2);			// str1에 str2 문자열 복사
    printf("바뀐 문자열 : %s\n", str1);
    
    strcpy(str1, ps1);			// str1에 ps1 문자열 복사
    printf("바뀐 문자열 : %s\n", str1);
    
    strcpy(str1, ps2);			// str1에 ps2(str2) 문자열 복사
    printf("바뀐 문자열 : %s\n", str1);
    
    strcpy(str1, "banana");
    printf("바뀐 문자열 : %s\n", str1);
}

첫 번째 인수 : char 배열이나 배열명을 저장한 포인터
두 번째 인수 : 문자열 시작 위치를 알 수 있는 변수


원하는 개수의 문자만 복사 strncpy() 함수

문자열을 복사할 때 문자의 수를 지정할 수 있다.

ex) 문자열 "apple-pie"의 앞에서 5개의 문자만 배열 str에 복사

#include <stdio.h>
#include <string.h>

int main() {
	char str[30] = "mango tree";
    
	strncpy(str, "apple-pie", 5);
    
    printf("%s\n", str);
}

str 배열을 apple로만 쓰려면 str[5] = '\0'로 널 문자를 추가해야 한다.


문자열 합치기 strcat, strncat 함수

문자열을 이어 붙인다.

#include <stdio.h>
#include <string.h>

int main() {
	char str[30] = "straw";
    
	strcat(str, "berry");		// str 배열에 문자열 붙이기
    printf("%s\n", str);
    
    strncat(str, "piece", 3);	// str 배열에 3개의 문자 붙이기    
    printf("%s\n", str);
}

붙여넣을 배열에서 널 문자의 위치를 찾고 그 위치부터 문자를 추가하고 마지막에 널 문자를 저장한다.

주의사항

  1. strcat 함수는 배열의 크기가 충분하지 않으면 메모리를 침범할 수 있다.
  2. strcat 함수를 사용할 때는 배열을 초기화해야 한다.
    (널 문자를 찾기 위함 / 쓰레기 값 중간에 추가될 가능성이 큼)

▼ 여러가지 초기화 방법 (빈 배열로)

char str[30] = {'\0'};		// 널 문자로 초기화

char str[30] = {0};			// 널 문자의 아스키코드 값으로 초기화

char str[30] = "";			// 큰따옴표 안에 아무것도 없으므로 널 문자로 초기화

char str[30];
str[0] = '\0';				// 첫 번째 배열 요소만 별도로 초기화

문자열 비교 strcmp, strncmp 함수

strcmp 함수는 두 문자열의 사전 순서를 판단하여 그 결과를 반환한다.
두 문자열이 같은지 판별할 때 사용할 수 있다.

strcmp(str1, str2);		// str1이 str2보다 사전에 나중에 나오면 1 반환
						// str1이 str2보다 사전에 먼저 나오면 -1 반환
                        // str1과 str2가 같은 문자열이면 0 반환

두 문자열에서 첫 문자부터 아스키코드 값을 비교하여 아스키코드 값이 크면 사전의 뒤에 나오는 문자열이 된다.

#include <stdio.h>
#include <string.h>

int main() {
	char str1[30] = "pear";
    char str2[30] = "peach";
    
    printf("사전에 나중에 나오는 과일 이름 : ");
    
    if(strcmp(str1, str2,) > 0)
    	printf("%s\n", str1);
    else
    	printf("%s\n", str2);
}

strncmp 함수는 비교할 문자의 개수를 지정할 수 있다.

printf("앞에서 3개의 문자만 비교하면?\n");
if(strncmp(str1, str2, 3) == 0)		// 앞에서 3개의 문자가 같으면
	printf("같다.\n");
else
	printf("다르다.\n");

[백준] 9086번: 문자열
[백준] 2744번: 대소문자 바꾸기
[백준] 1152번: 단어의 개수
[백준] 11721번: 열 개씩 끊어 출력하기
[백준] 9093번: 단어 뒤집기 (어려움)
[백준] 11586번: 지영 공주님의 마법 거울 (2차원 배열 + 문자열)

profile
노력형 인간

0개의 댓글