boostcource
모두를 위한 컴퓨터 과학 (CS50 2019) : David J. Malan
www.boostcourse.org/cs11
실습환경 : CS50 Sandbox & CS50 IDE
문자열
문자열(string)은 CS50 라이브러리 내의 자료형 중 하나로 문자(char)들의 배열이다.
만일 string s = "HI!"; 가 존재하면, s는 메모리 상에서 배열 형태로 저장되고
인덱스를 이용해 각 문자에 접근하는 것도 가능하다. (ex. s[1] = "I")
#include <stdio.h>
#include <cs50.h>
int main(void){
string s = "HI!";
printf("%c", s[1]); // ? I
}
마지막 문자인 ! 의 다음인 s[3]에 저장된 \0 은
문자열의 끝을 나타내는 null 종단 문자(또는 null 문자)이다.
문자열은 정해진 메모리 크기를 가지지 않고, 문자 수만큼 크기가 필요하다.
(이전에 메모리 학습 시, 문자열 자료형의 메모리 크기를 ??로 표기한 이유이다.)
때문에 C에서 컴퓨터는 항상 마지막에 null 종단 문자를 넣어 문자열의 끝을 나타낸다.
이 null 종단 문자는 단순히 모든 비트가 0인 1바이트(00000000)를 의미한다.
이번 예시는 여러 문자열을 동시에 선언한 경우다.
names라는 문자열에 4개의 이름을 저장한 뒤
첫번째 인덱스에 해당되는 문자열과, 그 문자열의 글자를 각각 출력하는 방법이다.
#include <stdio.h>
#include <cs50.h>
int main(void){
string names[4];
names[0] = "YURI";
names[1] = "MINSU";
names[2] = "JUNWOO";
names[3] = "JIHEE";
printf("%s\n", names[0]); // ? YURI
printf("%c%c%c%c\n", names[0][0], names[0][1], names[0][2], names[0][3]); // ? YURI
}
각 문자열의 글자는 2차원 배열을 통해 names[0][1] 과 같이 접근할 수 있다.
위 그림이 names가 실제 메모리상 저장된 예시이다.
문자열의 활용
문자열의 길이 및 탐색
다음은 사용자로부터 문자열을 입력받아 한 글자씩 출력하는 프로그램이다.
#include <stdio.h>
#include <cs50.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]);
}
}
// ? Input: Hello
// ? Ouput:
// ? H
// ? e
// ? l
// ? l
// ? o
string 라이브러리에 포함된 문자열의 길이를 알려주는 함수 strlen 을 활용하여
반복할 횟수를 문자열 s의 길이만큼으로 제한했다.
덕분에 s[0]부터 s[strlen(s)-1] 까지 한글자씩 모두 출력할 수 있다.
문자열 탐색 및 수정
다음은 사용자로부터 문자열을 입력받아 대문자로 바꿔주는 프로그램이다.
#include <stdio.h>
#include <cs50.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'){ // s[i]가 소문자
printf("%c", s[i]-32); // 대문자로 변환
} else {
printf("%c", s[i]);
}
}
printf("\n");
}
// ? Before: hELloWoRLd
// ? After: HELLOWORLD
이전에 ASCII 표에서 A-Z가 65-90, a-z가 97-122 로 표현할 수 있음을 확인했었다.
이를 이용해서 s[i] 가 문자(char)임에도 'a' >= s[i] >= 'z' 와 같이 숫자값으로 문자의 대소를 비교하고
s[i] - 32 를 적용한 뒤 %c 를 이용해 문자 형태로 출력하면 대문자가 출력된다.
또는 ctype 라이브러리의 함수 toupper 를 이용해서 대문자로 변환 할 수도 있다.
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.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");
}
// ? Before: hELloWoRLd
// ? After: HELLOWORLD
복습 퀴즈
Q1. 다음 중 문자열(string)이 메모리에 저장되는 방식에 대한 설명으로 틀린 것은?
① 문자열(string)은 포함된 문자(char) 개수 만큼의 메모리 자리를 차지한다.
② 문자열(string)은 문자(char)의 배열로 저장된다.
③ 문자열(string)의 끝에는 널(NULL) 종단 문자가 포함된다.
④ 문자열(string)의 각 문자(char)는 메모리상에 연이어서 저장된다.
답: ① 문자열(string)은 포함된 문자(char) 개수 만큼의 메모리 자리를 차지한다.
문자열은 문자의 배열들로 구성되며 마지막에는 널 종단 문자가 들어간다.
그러므로 문자 개수+1 만큼의 메모리 자리를 차지한다.
'CS > CS50' 카테고리의 다른 글
[CS][CS50] 알고리즘 - 검색 알고리즘 / 알고리즘 표기법 / 선형 검색 (0) | 2023.06.10 |
---|---|
[CS][CS50] 배열 - 명령행 인자 (1) | 2023.06.09 |
[CS][CS50] 배열 - 배열 (0) | 2023.05.29 |
[CS][CS50] 배열 - 컴파일링 / 디버깅 / 코드의 디자인 (0) | 2023.05.26 |
[CS][CS50] C언어 - 하드웨어의 한계 (2) | 2023.05.26 |