컴퓨터공학/배열

문자열의 활용

도전하는일반인 2021. 9. 15. 22:05

들어가기 전에

여태까지의 강의에서 문자열의 기본적인 개념들을 학습하였습니다. 이번 강의에서는 문자열을 좀 더 깊이 활용하는 방법을 배워보겠습니다. 문자열 안에 포함되어 있는 문자를 검색하기 위해서는 어떻게 해야 할까요? 또 특정 문자를 다른 문자로 바꾸기 위해서는 어떻게 해야 할까요? 이런 질문들에 답해보도록 하겠습니다.

 

학습 목표

문자열을 탐색하고 일부 문자를 수정하는 코드를 구현할 수 있습니다.

 

핵심 단어

  • strlen
  • toupper

문자열의 길이 및 탐색

사용자로 부터 문자열을 입력받아 한 글자씩 출력하는 프로그램을 만들어 보겠습니다.

간단하게 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와 ctype.h를 검색해보시면 사람들이 잘 정리한 글을 찾을 수 있을 것입니다. 코딩에서 자기가 검색해서 공부해보는 것도 매우 중요하기 때문에 직접 찾아보도록 하겠습니다.

 

 

출처 : https://www.boostcourse.org/cs112/lecture/119017?isDesc=false 네이버커넥트재단

'컴퓨터공학 > 배열' 카테고리의 다른 글

명령행 인자  (0) 2021.09.15
문자열과 배열  (0) 2021.09.15
배열2  (0) 2021.09.15
배열  (0) 2021.09.15
코드의 디자인  (0) 2021.09.15