문자열의 길이 및 탐색
사용자로부터 문자열을 입력받아 한 글자씩 출력하는 프로그램을 만들어 보자.
간단하게 for
루프를 통해 문자열의 인덱스를 하나씩 증가시키며 해당하는 문자를 출력하면 된다.
하지만 문자열의 끝을 어떻게 알 수 있을까?
한 가지 방법은 해당 인덱스의 문자가 널 종단 문자('\0')와 일치하는지 검사하는 것이다.
s
라는 문자열이 있을 때 for (int i = 0; s[i] != '\0'; i++) { ... }
와 같은 루프를 사용하면 된다. 그러나 strlen()
함수를 사용할 수도 있다.
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
string s = get_string("Input: ");
printf("Output:\n");
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");
}
먼저 사용자로부터 입력받은 문자열을 s
라는 변수에 저장한다.
그리고 s
의 길이만큼 for
루프를 돌면서 각 인덱스에 해당하는 문자가 'a'
보다 크고 'z'
보다 작은지 검사한다. 이는 소문자인지 검사하는 것과 동일하다.
문자의 대소비교가 가능한 이유는 ASCII값, 즉 그 문자가 정의되는 ASCII 코드 상에서의 숫자값으로 비교할 수 있기 때문이다.
알파벳의 ASCII 값을 살펴보면 각 알파벳의 소문자와 대문자는 32씩 차이가 난다.
따라서 각 문자가 소문자인 경우 그 값에서 32를 빼면 대문자가 된다.
각 문자가 이미 대문자인 경우 그대로 출력하면 된다.
이와 동일한 작업을 수행하는 함수가 ctype
라이브러리에 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");
}
toupper
함수의 사용
toupper
함수는 문자를 대문자로 변환해줘 직접 ASCII 값을 계산하지 않고도 손쉽게 문자열을 대문자로 변환할 수 있다.
ctype.h
라이브러리를 포함하여 사용할 수 있고 아래처럼 간단하게 사용할 수 있다.
#include <ctype.h>
int main(void)
{
char c = 'a';
printf("%c\n", toupper(c)); // 출력: A
}
References
https://www.boostcourse.org/cs112/lecture/119017?isDesc=false
'CSE > CS50' 카테고리의 다른 글
[CS50] 알고리즘 - 선형 검색, 이진 검색 (1) | 2024.06.13 |
---|---|
[CS50] 배열 - 명령행 인자 (1) | 2024.06.13 |
[CS50] 배열 - 문자열과 배열 (0) | 2024.06.13 |
[CS50] 배열 - 배열(2) (1) | 2024.06.13 |
[CS50] 배열 - 배열(1) (0) | 2024.06.13 |
경북대학교에서 컴퓨터과학을 전공하고 있는 학부생입니다. 컴퓨터 전공 관련 내용들과 프론트엔드 개발 지식들을 공유합니다. React, Javascript를 다룰 줄 알며 요즘에는 Typescript에도 관심이 생겨 공부하고 있습니다. 서로 소통하면서 프로젝트 하는 것을 즐기며 많은 대외활동으로 개발 능력과 소프트 스킬을 다듬어나가고 있습니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!