들어가기 전에

문자열을 다루기 위해서는 문자열 형식을 가진 변수가 필요하다. 사용자로부터 문자열을 입력받고 이를 다른 문자열과 합쳐서 출력하는 프로그램을 C로 작성해보자.

#형식지정자 #string #make

문자열

지난 스크리치 강의에서 사용자의 이름을 입력으로 받아 그 사람의 이름을 불러 인사를 했다. 이것을 C로 만들어보면 어떻게 될까? CS50 Sandbox에서는 스크래치의 ask함수와 가장 유사한 것이 바로 get_string 함수이다. String은 단어나 구절, 문장을 부르는 말이다. (숫자와는 다른 종류의 데이터이다)

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/94168777-b056-4e48-bdec-46aa452e9d6f/mceclip0_(1).png

사용자의 이름을 받아 저장할 변수를 스크래치와 같이 answer라고 정했다. 이때 변수는 x, y, z, name 등과 같이 마음대로 정해도 무관하다. 그러나 여기서 유의해할 점은 C는 오래된 언어이기 때문에 변수가 저장하는 데이터의 종류를 아주 정확하게 명시해줘야 한다. 그래서 우리는 저장하고자 하는 값의 종류가 문자열(string)이라는 것을 알려줘야 한다. 이때 string을 형식지정자라고 한다. 이것은 이름은 숫자가 아닌 문자이기 때문에 컴퓨터에게 "answer에 들어갈 것은 문자야!"라고 말해주는 것이다. string 이외에도 여러가지 종류가 있지만 그 것은 다음에 알아본다.

우리가 일반적으로 사용하는 =는 "같다"이다. 하지만 프로그래밍 언어에서는 오른쪽에서 왼쪽으로 가는 화살표와 비슷하다고 이해하면 좋다. 쉽게 말해 오른쪽에 있는 것을 왼쪽에 지정한다는 의미로, 이를 할당연산자라고 한다. get_string 함수가 사용자의 이름을 반환하면 그 이름을 answer라는 변수에 저장하는 것이다.

이제 컴퓨터의 메모리 어딘가에 사용자의 이름이 저장되어 있는 것이다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f9a2e4f2-996d-4080-a9e9-7772a1f8a4c0/mceclip0_(2).png

그럼 이것을 printf 함수로 출력해보자. 이때 유의해할 점은 printf("hello, answer"); 가 아니라는 점이다. 이 코드를 실행한다면 answer가 출력되어 hello, answer이 그대로 결과로 나온다.

우리는 answer이라는 변수에 들어있는 이름을 출력해야 하므로 %를 사용해준다. 이 때도 어떤 종류의 인자를 받는지 말해줘야 하므로 우리는 이름이라는 문자열을 받기 때문에 string에서 s를 %뒤에 붙여 인자를 받아준다. 그래서 최종적으로 printf("hello, %s\\n", answer);이 되는 것이다.

가장 위에 포함된 cs50.h 파일 안에 string 이라는 문자열 형식과 get_string 이라는 함수에 대한 코드가 포함되어 있다. 이 파일을 포함해야만 전체 코드를 컴파일하고 실행할 수 있다.

#include <cs50.h>
#include <stdio.h>

int main(void)
{
	string answer = get_string("what's your name?\\n");
	printf("hello, %s\\n", answer);
}

터미널 창에 아래 명령어를 입력하여 컴파일 할 수 있다.

$ clang -o string string.c -lcs50

여기서 -o string는 string.c를 string.out이라는 머신코드로 저장하도록 하는 명령어이다. -lcs50는 "link"라는 의미를 지닌 -l 이라는 인자에 우리가 추가로 포함한 "cs50" 파일을 합친 것으로 이를 통해 컴파일 시 cs50 파일을 연결하도록 알려줄 수 있다. 이렇게 하면 cs50의 코드와 string.c의 코드가 한 프로그램에서 실행될 수 있도록 합쳐진다.

다소 복잡한 이런 과정 대신에, 아래 make 명령어를 통해 간단하게 컴파일을 수행할 수도 있다. make라는 명령어는 알아서 어떠 인자를 사용해야 할지 파일명은 무엇으로 할지 다른 사람들은 어떤 라이브러리나 코드를 연결했는지 등을 찾아준다.

$ make string