본문 바로가기

Education

[부스트 코딩 뉴비 챌린지 2020] week2_Q&A

반응형

Q1.

파이썬에서 같은 경우에는

받아온 문자열이 day에 저장되면 day==“월요일“ 이렇게만 입력해도 문자열이 비교가 되는데

day=input() if(day=='sunday'): print("true")

 c언어에서는 

day에 저장된 문자열과 "월요일"이 같은지 비교 하려면 srtcmp함수를 사용해서 srtcmp(day,"월요일") 이렇게 작성해야 비교가 됩니다.

#include <cs50.h> #include <stdio.h> #include <string.h> int main(void){ string day = get_string("요일을 입력하세요.\n"); if(strcmp(day,"일요일")==0){ printf("true"); } }

파이썬에서는 왜 간단히 비교연산자만 사용해도 되는지 또 c언어는 다른 함수를 써줘야 하는지 두가지가 궁금합니다!

그리고 마지막으로 질문으로 생성된 변수에는 항상 주소값이 생기는 건가요?

 

A1.

3차시 수업에서 문자열에 대해 자세히 배우게 됩니다. 

문자열(string)과 배열(list)이 확실히 구분되는 python과는 다르게,

C언어에서는 문자열(string)도 배열(array)로 취급됩니다.

C언어에서 array의 특징은, 그 크기를 함부로 특정할 수 없다는 것입니다. 

이는 C는 python보다 메모리에 직접 접근하기 쉬운 언어이기 때문입니다. 

 

이 때문에 C는 문자열을 직접 비교할 수 없거나, 포인터를 확실하게 이해한 후 사용해야 한다는 불편한 점이 있지만, python은 컴퓨터가 거의 모든 걸 해주기 때문에 최적화에는 좋지 않습니다. 각각의 장단점이 있지요.

 

생성된 변수들은 모두 메모리에 저장이 되고메모리는 모두 주소가 있기 때문에 생성된 변수들은 모두 주소값을 갖게 됩니다.

 

 

Q2.

어제 찬차드님께서 널문자가 받침이라는 말씀에 맞다고 생각했었는데, 회의 끝나고 정리하면서 생각해보니 "월요일" 글자에 받침이 2개뿐이더군요.

궁금해서 찾아보니 널문자는 문자열을 출력할 문자열이 끝나는 지점을 알려주기 위해 마지막에 1byte null(=\0) 추가한다고 합니다.

예로 들어서 string a = "I like C programming" 이라고 지정한 경우, str[8]=\0 이라고 작성하게 되면 문자열을 출력할 "I like C"까지 출력된다고 하네요. (https://m.blog.naver.com/PostView.nhn?blogId=jsky10503&logNo=221131412375&proxyReferer=https:%2F%2Fwww.google.com%2F)

그런데 저희가 샌드박스에서 코드를 작성하면서 샌드박스에서 한글이 한글자이 할당되는 크기가 예상한 것과 달라서 질문이 생겼는데요.

샌드박스에서 작성했을 때

크기가 3씩 할당되어서 10이 된다. 하지만 아래와 같이 visual studio에서 작성해보면

2씩 할당 되어 총 7이 할당 되는 것으로 나온다. 왜 두개의 결과가 다르게 나오는 걸까?

 

 

A2.

제가 쓰는 VScode와 온라인 컴파일러에서는 모두 10 byte로 출력되는데요, 아마도 unicode와 uft-8의 차이가 아닐까 싶습니다. unicode에서는 한글 한 자를 2 byte로, uft-8에서는 3 byte로 인식한다고 합니다. 아래 사이트를 참고하시면 좋을 것 같습니다.

https://medium.com/@jeongdowon/unicode%EC%99%80-utf-8-%EA%B0%84%EB%8B%A8%ED%9E%88-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-b6aa3f7edf96

 

Unicode와 UTF-8 간단히 이해하기

유니코드(Unicode)

medium.com

 

 

 

Q3.

C언어에서는 문자열의 데이터 형식에 string 없어서 char* a[] 같이 char 배열로 나타내어 문자열을 나타냅니다.

하지만 강의에서 string 데이터 형식을 사용하는 이유가 무엇인가요?

 

A3.

말씀하신 것처럼 data type 중 string이 없어 처음 사용하기에는 불편하기 때문입니다.

C가 python에 비해 어렵다고 말하는 것들 중 하나가 바로 포인터인데요, 문자열을 배열로 나타낸 후 포인터를 이용하여 문자열에 접근해야하기 때문입니다. 이 강좌는 프로그래밍의 처음부터 시작하므로 포인터부터 다 배울 수는 없으므로 여러분을 위해 더 쉬운 방법을 사용한 것입니다. cs50에서만 사용할 수 있는 함수인 get_int나 get_string 등도 모두 여러분이 프로그래밍과 친해지기 위해 staff가 만든 것들입니다.

반응형