문자열 안에 포함되어 있는 문자를 검색하기 위해서는 어떻게 해야 할까?
그리고 특정 문자를 다른 문자로 바꾸기 위해서는 어떻게 해야 할까?
문자열의 길이 및 탐색
사용자로 부터 문자열을 입력받아 한 글자씩 출력하는 프로그램을 만들어 보자.
간단하게 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");
}
생각해보기
string.h와 ctype.h의 라이브러리에 다른 어떤 함수가 있는지 확인해 보고, 어떤 함수를 어떻게 활용해 볼 수 있을지 생각해보자.
정답
- string.h 라이브러리는 C 언어에서 문자열을 다루는 데 사용되는 다양한 함수들을 제공한다.
- strlen(): 문자열의 길이를 계산한다.
- strcpy(): 한 문자열을 다른 문자열로 복사한다.
- strcat(): 두 문자열을 연결한다.
- strcmp(): 두 문자열을 비교한다.
- strlwr(): 문자열을 소문자로 변환한다.
- strupr(): 문자열을 대문자로 변환한다.
gets()와 puts(): 문자열 입력을 받고 출력하는 함수이지만, 이들은 stdio.h 헤더 파일에 정의되어 있다.
ctype.h 라이브러리는 문자 데이터를 처리하는 데 사용되는 함수들을 제공한다.
- isalpha(): 문자가 알파벳인지 확인한다.
- isdigit(): 문자가 숫자인지 확인한다.
- isalnum(): 문자가 알파벳 또는 숫자인지 확인한다.
- isupper(): 문자가 대문자인지 확인한다.
- islower(): 문자가 소문자인지 확인한다.
- toupper(): 문자를 대문자로 변환한다.
- tolower(): 문자를 소문자로 변환한다.