우오! 신기하다.
c언어에서 char은 하나의 캐릭터(한 글자)를 나타내고, 이를 연결한 것이 string(문자열/문자배열)이다. 그런데 어떻게 string의 끝을 알까?
스트링은 char의 배열처럼 저장이 된다고 한다.
그래서
string s = "hi!"
라고 한다면, 이는 문자 하나하나의 배열이라는 것
그래서 아래처럼 되는 것이다.
s[0] = h
s[1] = i
s[2] = !
s[3] = \0
이는 우리가 스트링을 printf할 때에도 컴퓨터가 인식하는 방법이다.
그러나 스트링의 끝을 알기위해, 끝에는 \0 이 들어간다.
이는 null이라고도 불리는, 모든 비트가 0인 1바이트이다.
컴퓨터는 매 배열을 탐색하며(문자열) 이것은 null인가?
아니면 출력 null이면 문자열(배열)의 끝임을 알고 멈춘다.
그리하여 배열 안의 다른 변수와 구분 가능하다.
그러나 이를위해 1개의 바이트를 더 소모하게 된다.
js에서 대소문자를 변환할 때는 toUpperCase / toLowerCase
라는 메소드를 사용했었다.
한번도 어떤 방식으로 진행되는지 생각을 안 해봤다.
이번에 알게된 것은, 소문자와 대문자는 32만큼의 ASCII 코드 차이가 있다. 그래서 대소문자는 +/- 32를 해서 서로 변환이 가능하다는 것.
또한 재밌는 것은, 문자를 비교할 수 있다는 것이다.
예를들어 어떤 문자가 a보다 크고 z보다 작다 라고 비교할 수 있다. 자동으로 ascii코드로 비교해 준다. C에서는.
그래서 대소문자 변환도 a-32 A+32 이런 식으로 가능하다.
형변환을 하지 않아도 알아서 된다.
c언어는 까다롭기도 하지만 활용할 것들도 많다는 걸 배웠다.
C에서 메인 함수인 int main(void) 함수도
결국 함수이다. 그렇기 때문에 인자를 받을 수 있다.
파일이 argc 일때,
make argc 이후
./argc David -> 인자를 두개 받는 것이다.
첫번째는 argc 두번째는 David 를 받고 있다.
그래서 david라는 하나의 인자만 넣는 것 같지만 사실 두개를 넣고 있다. 그래서 david에 접근하려면 배열[1]을 이용하며, length는 2가 된다.