CS 기초/배열

[CS50] 문자열의 활용

담크 2021. 8. 9. 20:48

지금까지 문자열의 기본적인 개념들을 학습해봤습니다. 이번 포스팅에서는 문자열을 활용하여 특정 문자를 다른 문자로 치환하거나 문자열 안에 포함되어있는 문자를 검색해보는 방법에 대해 공부해보도록 하겠습니다.

 

문자열의 길이 및 탐색

사용자로부터 문자열을 입력받아 문자열을 출력하기 위해서는 문자열의 끝을 알아야합니다. 그렇다면 정해지지 않은 문자열의 끝은 어떻게 알 수 있을까요?

문자열의 끝을 알수있는 방법 중 하나는 인덱스의 문자가 종단 문자(\0)와 일치하는지 검사하는 것입니다.

for (int i = 0; s[i] != '\0'; i++){
	.....
}

s라는 문자열이 있다고 했을 때 이런 식으로 길이를 구할 수 있습니다.

다른 방법은 strlen( )이라는 함수를 사용하는 것입니다.

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

int main(void){
	string s = get_string("Input: ");
    printf("Output: ");
    for(int i = 0, n = strlen(s); i < n; i++){
    	printf("%c\n", s[i]);
    }
}

strlen은 <string.h> 라이브러리 안의 함수로 문자열의 길이를 알려주는 함수입니다.

따라서 위의 코드는 n이라는 변수에 문자열 s의 길이를 저장하고 해당 길이만큼 for문 안의 내용을 반복합니다.

이렇게 하면 일일이 종단 문자를 검사하는 것보다 효율적이겠죠

 

 

문자열 탐색 및 수정

그렇다면 이번엔 사용자로부터 입력받은 문자열을 대문자로 바꿔주는 코드를 작성해보겠습니다.

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

int main(void)
{
    string s = get_string("Before: ");
    printf("After: ");
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        if (s[i] >= 'a' && s[i] <= 'z')
        {
            printf("%c", s[i] - 32);
        }
        else
        {
            printf("%c", s[i]);
        }
    }
    printf("\n");
}

사용자로부터 문자열을 입력받는 것은 동일하지만 if문으로 소문자 a ~ z까지를 확인합니다. 만약 소문자라면 그 인덱스 값을 s[i] - 32를 해주는데 이는 ASCII 코드 표를 보면 이해하기 편할 겁니다.

여기서 대문자 A와 소문자 a를 10진법으로 바꾸면 65와 97입니다. 따라서 ASCII 코드표에서의 알파벳 대소문자는 숫자 32 크기만큼의 차이를 가집니다. 만약 s[i]가 소문자 a일 경우 97에서 32를 뺀 65, 즉 대문자 A가 나오게 되는 것입니다. 문자가 이미 대문자인 경우는 그냥 출력해주면 되겠죠 ㅎㅎ

 

그런데 이러한 기능 역시 함수로 사용할 수 있습니다. 바로 <ctype.h> 라이브러리의 toupper( )라는 함수입니다.

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

int main(void)
{
    string s = get_string("Before: ");
    printf("After: ");
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        printf("%c", toupper(s[i]));
    }
    printf("\n");
}

이렇게 실행하게 되면

대문자로 바뀌어서 잘 나오는 것을 볼 수 있습니다.

 

라이브러리의 다른 기능을 확인하고 싶으시다면

https://manual.cs50.io/

 

CS50 Manual Pages

CS50 Manual Pages Manual pages for the C standard library, C POSIX library, and the CS50 Library for those less comfortable. aio.h aio_cancel - cancel an outstanding asynchronous I/O request aio_error - get error status of asynchronous I/O operation aio_fs

manual.cs50.io

요 페이지를 참고해주세요 해당 라이브러리의 다양한 함수들을 잘 정리해뒀습니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 배열' 카테고리의 다른 글

[CS50] 명령행 인자  (0) 2021.08.10
[CS50] 문자열과 배열  (0) 2021.08.08
[CS50] 배열  (0) 2021.08.07
[CS50] 코드의 디자인  (0) 2021.08.06
[CS50] 디버깅  (0) 2021.08.05