이 영역을 누르면 첫 페이지로 이동
Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

페이지 맨 위로 올라가기

Daily Growth

Loving you is the reason I live. That’s why every day is precious, a step toward my dreams and you.

문자열 처리와 변환: 문자열 길이 구하기, 대소문자 변환하기

  • 2025.03.20 15:00
  • IT

1. 문자열 길이 구하기

프로그래밍을 처음 시작하면, 문자열을 다룰 때 가장 기본적인 문제는 문자열의 길이를 어떻게 구할 것인가 하는 것이다. C에서는 문자열의 끝을 널 종단 문자(\0)로 구분한다. 그래서 문자열을 하나씩 순차적으로 읽으면서, \0을 만날 때까지 반복문을 실행하면 된다.

 

하지만 한 가지 단점은, 문자열의 끝을 알기 위해서는 문자열을 하나하나 읽으면서 확인해야 한다는 것이다. 이를 개선하기 위해 사용할 수 있는 함수가 바로 strlen() 함수다.

 

첫 번째 방법: \0을 확인하면서 길이 구하기

가장 기본적인 방법은 for 루프를 사용해서 문자열을 하나씩 읽으면서 끝을 확인하는 것이다.

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

int main(void)
{
    string s = get_string("Input: ");
    printf("Output: ");
    for (int i = 0; s[i] != '\0'; i++)  // 문자열의 끝을 \0으로 확인하며 순차적으로 출력
    {
        printf("%c", s[i]);
    }
    printf("\n");
}

이 코드는 s[i] != '\0' 조건을 사용해 문자열을 한 글자씩 출력한다. 문자열의 끝을 \0으로 인식하고 이를 기준으로 출력하는 방법이다.

 

두 번째 방법: strlen() 함수 사용하기

strlen() 함수는 문자열의 길이를 미리 계산해서 알려준다. 이 방법은 매번 문자열을 하나씩 확인하지 않고, 문자열의 길이를 한 번만 구하고 그 길이만큼 반복문을 돌리므로 효율적이다.

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

int main(void)
{
    string s = get_string("Input: ");
    printf("Output: ");
    for (int i = 0; i < strlen(s); i++)  // strlen()으로 문자열 길이를 한 번만 구해서 사용
    {
        printf("%c", s[i]);
    }
    printf("\n");
}

이 코드에서는 strlen(s)를 사용해 문자열의 길이를 구하고, 그 길이만큼 반복문을 돌린다. strlen(s)는 문자열을 한 번만 읽고 길이를 계산하기 때문에 조금 더 효율적이다.

 

세 번째 방법: strlen() 결과를 변수에 저장하기

strlen()을 반복적으로 호출하는 것보다, 한 번만 계산하고 그 값을 변수에 저장하여 반복문에서 사용하는 방법이다. 이렇게 하면, strlen() 함수가 매번 호출되는 비효율성을 피할 수 있다.

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

int main(void)
{
    string s = get_string("Input: ");
    printf("Output: ");
    int n = strlen(s);  // 문자열 길이를 한 번만 계산해서 n에 저장
    for (int i = 0; i < n; i++)  // 저장된 n을 이용해서 반복문 실행
    {
        printf("%c", s[i]);
    }
    printf("\n");
}

이 방식은 문자열의 길이를 n에 저장하고, 그 값만을 이용해 반복문을 돌리기 때문에, 효율성과 가독성 모두 좋아진다.

네 번째 방법: 변수 선언과 초기화를 한 줄로

이 방법은 조금 더 간결한 코드 스타일을 원할 때 유용하다. 반복문 안에서 n 변수를 선언하고 초기화까지 한 줄로 처리할 수 있다. 이 방식은 코드가 간결해지지만, 가독성이 떨어질 수 있으므로 상황에 맞게 사용해야 한다.

#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", s[i]);
    }
    printf("\n");
}

이 코드는 for 루프 시작 부분에서 n을 선언하고 동시에 strlen(s)로 초기화한다. 이 방법은 코드가 간결하고, 문자열의 길이를 매번 묻지 않기 때문에 효율적이다.

 

 

2. 대소문자 변환

문자열을 다루는 또 다른 중요한 작업은 대소문자 변환이다. 예를 들어, 문자열에서 소문자를 대문자로 바꾸고 싶다면 어떻게 해야 할까? 이를 위해서는 각 문자의 ASCII 값을 활용할 수 있다.

첫 번째 방법: ASCII 값으로 대소문자 변환하기

알파벳의 대소문자는 ASCII 코드에서 일정한 차이를 가지고 있다. 예를 들어, 소문자 'a'는 97이고, 대문자 'A'는 65이다. 이 둘의 차이는 32이므로, 소문자에서 32를 빼면 대문자로 변환할 수 있다. 반대로 대문자에서 32를 더하면 소문자가 된다.

#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);  // 소문자에서 32를 빼서 대문자로 변환
        }
        else
        {
            printf("%c", s[i]);  // 대문자는 그대로 출력
        }
    }
    printf("\n");
}

위의 코드는 소문자인 경우 32를 빼서 대문자로 변환하고, 대문자는 그대로 출력하는 방식이다. 이렇게 하면, ASCII 값을 활용해 문자열을 대소문자로 변환할 수 있다.

두 번째 방법: toupper() 함수 사용하기

이제 좀 더 편리하고 깔끔한 방법을 사용해보자. ctype.h 라이브러리의 toupper() 함수는 문자가 소문자일 경우 자동으로 대문자로 변환해준다. 이 함수를 사용하면, 우리가 직접 ASCII 값을 다루지 않아도 된다.

#include <cs50.h>
#include <ctype.h>  // toupper 함수 사용을 위해
#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]));  // toupper() 함수로 대문자로 변환
    }
    printf("\n");
}

toupper() 함수는 문자가 소문자일 때만 대문자로 변환하고, 이미 대문자인 경우는 그대로 반환한다. 이 방법은 매우 간결하고 가독성이 좋다.

 

3. string.h와 ctype.h 라이브러리 함수들

우리가 사용한 strlen()과 toupper() 외에도 string.h와 ctype.h 라이브러리에는 매우 유용한 함수들이 있다. 이 함수들을 활용하면 더욱 효율적이고 깔끔한 코드 작성이 가능하다.

string.h 라이브러리 함수

  • strlen(): 문자열의 길이를 반환한다.
  • strcmp(): 두 문자열을 비교한다.
  • strcpy(): 문자열을 복사한다.
  • strcat(): 두 문자열을 이어 붙인다.

ctype.h 라이브러리 함수

  • isupper(): 문자가 대문자인지 확인한다.
  • islower(): 문자가 소문자인지 확인한다.
  • toupper(): 소문자를 대문자로 변환한다.
  • tolower(): 대문자를 소문자로 변환한다.

이 함수들은 문자열을 처리하거나, 문자의 대소문자를 쉽게 변환하는 데 유용하다. toupper()와 tolower()는 특히 반복적인 대소문자 변환을 손쉽게 해줄 수 있다.


오늘은 문자열을 다루는 여러 가지 방법을 공부해서 감사하다🧚🏻. 문자열의 길이를 구하는 방법부터 시작해서, 대소문자 변환을 위한 다양한 방법을 배우고, 점차적으로 코드가 향상되는 방식을 경험했으니까(: C에서 문자열을 효율적으로 다루는 방법을 배우는 것은 매우 중요하며, 이를 통해 더 나은 코드를 작성할 수 있게 된다. 앞으로는 string.h와 ctype.h에서 제공하는 다양한 함수들을 활용해 더 복잡한 문자열 처리 문제를 해결할 수 있을 것이다🥰.

반응형

'IT' 카테고리의 다른 글

C언어 명령행 인자 (Command-Line Arguments) 완벽 이해하기  (0) 2025.03.21
C 언어에서 '\0'과 ""의 차이: 문자와 문자열의 핵심 차이 이해하기  (0) 2025.03.21
C 언어 문자열과 널 종단 문자 완벽 이해 | 문자 배열 vs 문자열 배열 차이  (0) 2025.03.19
동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석  (0) 2025.03.18
C 언어 디버깅 & 코드 품질 향상: check50, style50, 배열 활용 가이드  (0) 2025.03.17

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • C언어 명령행 인자 (Command-Line Arguments) 완벽 이해하기

    C언어 명령행 인자 (Command-Line Arguments) 완벽 이해하기

    2025.03.21
  • C 언어에서 '\0'과 ""의 차이: 문자와 문자열의 핵심 차이 이해하기

    C 언어에서 '\0'과 ""의 차이: 문자와 문자열의 핵심 차이 이해하기

    2025.03.21
  • C 언어 문자열과 널 종단 문자 완벽 이해 | 문자 배열 vs 문자열 배열 차이

    C 언어 문자열과 널 종단 문자 완벽 이해 | 문자 배열 vs 문자열 배열 차이

    2025.03.19
  • 동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석

    동적 배열 vs 고정 배열: 점수 평균 구하는 코드 비교 및 장단점 분석

    2025.03.18
다른 글 더 둘러보기

정보

Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

  • Daily Growth의 첫 페이지로 이동

검색

메뉴

    카테고리

    • 분류 전체보기 (443) N
      • Design History (69)
      • IT (144) N
      • Typography (13)
      • UX • UI Design (10)
      • Money (62)
      • Health (53)
      • Words (6)
      • Reading (21)
      • English (64)

    나의 외부 링크

    • lody.design
    • lody.canada
    • lody.study
    • lody.diary

    정보

    self-improvement의 Daily Growth

    Daily Growth

    self-improvement

    블로그 구독하기

    • 구독하기
    • 네이버 이웃 맺기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. Copyright © self-improvement.

    티스토리툴바