CS50자체 라이브러리에 문자열길이를 구하는 함수 strlen
교수님은 그냥 for문을 쓸 때
striing s = "어떤 문장열";
for(int i = 0; i < strlen(s); i++)
{
printf("%c", s[i]);
}
이렇게 쓰면 strleng()
호출을 매 반복문이 돌 때마다 "호출"해야 하기 때문에,
striing s = "어떤 문장열";
int n = strlen(s);
for(int i = 0; i < n; i++)
{
printf("%c", s[i]);
}
이렇게 변수에 문자열 길이를 할당해 놓고, 반복문 안에서 돌리면,
개선 된 방법은 엄밀히 얘기하면, 공간복잡도 즉 메모리가 차지하는 공간이 더 늘어난다는 단점? 이 있기는 하지만,
시간복잡도와 공간복잡도, 둘중에무엇을 선택해야 하는지 어떤게 더 중요한지를 바라볼 때,
위 예시는 아주 단순하고 작은 예시같지만 중요한 토픽인 것 같다.
string s = "abcdef"
if(s[0] > s[1])
{
// 무엇을 해라
}
이렇게 문자열 끼리 비교하면 무슨 기준으로 하는 것일까?
바로 아스키 코드이다
신기하게도, 알파벳 대문자에서 32만 더하면 같은 알파벳 소문자가 된다.
그래서 이 강의에서는, 문자열을 순회하며 모든 글자를 대문자로 만들고 싶을 때,
반복문안에서
// s라는 문자열 선언
// 위는 for문 로직
if(s[i] >= 'a'&& s[i] <= 'z')
{
printf(%c, s[i] - 32)
}
즉 문자 하나가 "a" 보다 크거나 같고, "z"보다 작거나 같으면(소문자만 걸른다는 뜻)
저렇게 -32
해주면 모든 글자를 대문자로 변환하여 출력하게 된다.
아스키 코드를 이용하여 대문자로 바꾸다니, Javascript toLowerCase(), toUpperCase() 도 같은 로직이려나??
최대한 기계어와 가까운 방식이라고 한다.
워드, 구글 독스 같은 곳에서도 같은 방식을 수행하여, 대문자 소문자로 바꾼다고 한다.
하지만 이것은 매우 복잡 혹은 코드가 길게 쓸 수 밖에 없으니,
이것을 위해 만들어진 함수를 써보자.
쓰기 위해서 파일을 가져오고, 프로토타입을 선언해야하는데,
CS50 웹사이트에서 이런 문서들을 제공한다고 한다.
저것을 기반으로 보면
#include <ctype.h>
이란 파일을 헤더에 넣어야 하고
#include <ctype.h>
int toupper(int c);
int tolower(int c);
프로토타입을 미리 선언해줘야 함수를 사용할 수 있다고 한다.
함수를 사용하려면
#include <ctype.h>
int toupper(int c);
int tolower(int c);
// s라는 문자열 선언
for(int i = 0; n = strlen(s); i < n; i++){
if(s[i] >= 'a'&& s[i] <= 'z')
{
printf(%c, toupper(s[i]);
}
}
이런식으로 갔다가 쓰면 된다.
C뿐만 아니라, 자바스크립트에서도 내부적으로 어떻게 이 함수가 돌아가는 지 알게 된 것 같다.
여기서 학생질문, 왜 반복문안의 i는 int라는 타입 선언을, n에는 하지 않았는가?
-> 교수님: i와 타입이 같으면 같으면 n위치에 오는것은 하지 않아도 된다. 다만 다르다면 해야한다.
출처 : [부스트코스] 모두를 위한 컴퓨터 과학 (CS50 2019) (https://www.boostcourse.org/)