문제
Hello World!를 출력하시오.
코드
1 2 3 4 5 6 | #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } | cs |
문제
Hello World!를 출력하시오.
코드
1 2 3 4 5 6 | #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } | cs |
먼저 strlen은 문자열의 길이를 구하는 함수이다. 이 때 null 문자인 '\0'은 포함하지 않는다. strlen 함수는 string.h 헤더에 선언되어있다.
반면 sizeof는 연산자로 피연산자의 메모리 크기를 바이트 단위로 계산한다. 상수, 변수 뿐만 아니라 자료형 그 자체가 피연산자가 될 수 있다. 연산자이기 때문에 상수나 변수의 경우 반드시 괄호를 사용해 묶을 필요는 없다. (자료형의 크기를 구할 때는 괄호를 사용하여야 한다.) 하지만 sizeof는 높은 연산자 우선순위를 가지고 있기 때문에 피연산자가 단항이 아니라면 일반적으로 괄호로 묶어준다. 또한 size는 컴파일타임 연산자이기 때문에 sizeof와 피연산자는 컴파일 단계에서 결과 값을 가진다. (정수 a가 있을 때 sizeof ++a 나 sizeof a++은 a의 값을 변화시키지 않는다.)
예제를 통해 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str1 = "MoscowMule"; char str2[20] = "MoscowMule"; char *str3 = (char *)malloc(sizeof(char) * 20); str3 = "MoscowMule"; printf("sizeof(str1): %d\n", sizeof(str1)); printf("sizeof(str2): %d\n", sizeof(str2)); printf("sizeof(str3): %d\n", sizeof(str3)); printf("strlen(str1): %d\n", strlen(str1)); printf("strlen(str2): %d\n", strlen(str2)); printf("strlen(str3): %d\n", strlen(str3)); printf("printf(str1): %s\n", str1); printf("printf(str2): %s\n", str2); printf("printf(str3): %s\n", str3); return 0; } | cs |
위 코드를 실행 시키면 아래와 같은 출력이 나온다
sizeof(str1): 4 sizeof(str2): 20 sizeof(str3): 4 strlen(str1): 10 strlen(str2): 10 strlen(str3): 10 printf(str1): MoscowMule printf(str2): MoscowMule printf(str3): MoscowMule | cs |
sizeof 부터 살펴보자.
다음은 strlen과 printf 이다.
결국 세 변수 (str1, str2, str3)은 모두 "MoscowMule"이라는 같은 문자열이다.
따라서 strlen을 사용하면 null 문자를 제외한 길이인 10이 나오게 되고, printf를 사용하면 그대로 출력이 된다.
틀린 내용이나, 수정해야할 부분이 있다면 댓글로 남겨주십시오.
바로 조치하겠습니다. 감사합니다.