문자열 처리와 변환: 문자열 길이 구하기, 대소문자 변환하기
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 |
댓글
이 글 공유하기
다른 글
-
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