Chapter 10

GraGrass·2024년 2월 12일

문자열 처리 함수

ctype.h 계열

1. ctype.h 계열의 문자 검사 함수들

함수True를 return하는 인자
isalnum()알파뉴메릭 문자 (알파벳 혹은 숫자)
isalpha()연산을 진행 후 값을 1 감소 (선연산, 후 감소)
isblank()표준 블랭크 문자(스페이스, 수평탭, 개행) 또는 부가적으로 이 역할을 하도록 정의된 local 문자
isdigit()숫자
islower()영어 소문자
isupper()영어 대문자

2. ctype.h 계열의 문자 맵핑 함수들

함수수행 동작
tolower()대문자 전달 -> 소문자 변환한 버전 return, 소문자 전달 -> 그대로 return
toupper()소문자 전달 -> 대문자로 변환한 버전 return, 대문자 전달 -> 그대로 return

문자열 변경 함수

1. strlen

개요

#include <string.h>

size_t strlen(const char *s); 
// 전달 과정에서 원래 string이 손상되지 않도록 reference로 전달
  • 인자로 전달된 문자열의 길이를 return

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

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

int main(void)
{
	char str[100];
    while (1)
    {
    	fgets(str, sizeof(str), stdin);
        printf("문자열 길이: %zd\n", strlen(str));
    }
    return 0;
}

  • 문자열 길이에서 입력을 위한 Enter도 포함하여 길이 출력
    ex. 123456 입력 후 Enter -> "123456\n" -> 문자열 길이: 7
  • 문자열의 마지막에 추가되는 NULL 문자(\0)는 문자열의 길이에 포함 X

2. strcpy, strncpy

개요

#include <string.h>

char* strcpy(char* dset, const char* src);
char* strncpy(char* dset, const char* src, size_t n);
  • dest로 전달된 배열에 src로 전달된 string 복사
  • dest 길이가 src보다 작을 때 overflow 발생
  • strncpy()는 복사할 최대 문자열 길이 지정 가능

문자열을 복사하는 strcpy와 strncpy 함수

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

int main(void)
{
    char str1[20] = "Samuel P. Harbison";
    char str2[10];

    printf("Original String: %s\n", str1);
    strncpy(str2, str1, sizeof(str2) - 1);
    str2[sizeof(str2) - 1] = '\0';
    printf("New String : %s\n", str2);
    return 0;
}

  • string의 마지막 원소는 무조건 NULL이 되어야 함
  • dest의 9번째 요소까지 strncpy()한 후 마지막에 NULL 추가

3. strcat, strncat

개요

#include <string.h>

char* strcat(char *dest, const char *src);
char* strncat(char *dest, const char *src, size_t n);
// n은 추가 문자열인 src의 최대 길이 지정
  • dest 문자열 끝에 src 문자열을 추가하는 함수
  • return 시 추가된 문자열(dest)의 포인터 반환
  • 문자열 추가 시 dest 문자열 끝의 '\0' 삭제 후 src 추가
  • dest 길이가 충분치 않다면 overflow 발생

문자열을 추가하는 strcat와 strncat 함수

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

char *str2 = "Hello Everybody!";

int main(void)
{
    char str1[20];
    size_t len = strlen(str2);

    for (size_t i=1; i <= len; ++i) {
        strcpy(str1,""); // NULL 문자 추가
        strncat(str1, str2, i);
        puts(str1);
    }
    return 0;
}

4. strcmp, strncmp

==을 사용한 비교

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

int main(void)
{
    char* str1 = "Hello";
    char str2[7];
    strcpy(str2, str1);
    printf("str1: : %s\n", str1);
    printf("str2: : %s\n", str2);
    if (str1 == str2)
        printf("str1 is equal to str2.\n");
    return 0;
}

  • str1 is equal to str2가 출력되지 않음 -> 다른 string 취급!
  • if문이 비교한 것은 문자열 내용 X str1, str2라는 포인터 O
  • str1, str2는 내용은 같지만 다른 위치의 문자열을 가리킴

문자열을 비교하는 strcmp, strncmp 함수

#include <string.h>

int strcmp(const char *s1, const char *s2);
// 포인터 s1, s2가 가리키는 char의 비교 결과를 return
return 값의미
0보다 큰 값(양수)s1 > s2
0s1 == s2
0보다 작은 값(음수)s1 < s2
  • 각각 char 별 ASCII 코드 값의 차이를 비교 (str1-str2)
  • 두 문자열의 첫번째 char 비교 후 같지 않으면 바로 return
  • 첫번째 char이 같다면 순차적으로 다음 char 비교
  • 이런 식으로 string 끝까지 비교

5. atoi, atol, atof

개요

#include <stdlib.h>
int atoi(char *ptr); // string -> int
long atol(char *ptr); // string -> long
double atof(char *ptr); // string -> double
  • 인자로 문자열을 전달하면 해당 문자열을 숫자로 변환하여 return
  • a(숫자로 되어있는 string) to int/long/double

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

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char* str1 = "123";
    char* str2 = "321";
    printf("123 + 321 = %d\n", atoi(str1)+atoi(str2));
    return 0;
}

6. sprintf

문자열에 출력하는 sprintf 함수

#include <stdio.h>

int sprintf(char *str, const char *format, ...);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char inputs[10][20];
    // string을 저장하는 배열 inputs

    for (int i = 0; i < 10; ++i) {
        sprintf(inputs[i], "input%02d.dat",i);
        // inputs 배열의 i번째 원소인 string에  "input0i.dat" 출력
        printf("%s\n", inputs[i]);
        // sprintf()로 출력한 string을 화면에 출력
    }
    return 0;
}

  • printf()와 비슷하게 동작, but 타깃 문자열의 주소인 *str가 인자로 추가됨
  • 화면 출력이 아닌 타깃 문자열 *str에 내용을 출력함
  • return 값은 작성 성공한 char의 개수
profile
올해는 진짜 갓생 산다

0개의 댓글