본문 바로가기

Study_C, C++/홍정모의 따라하며 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 4.3 문자열이 메모리에 저장되는 구조 ~ 4.5 기호적 상수와 전처리기

728x90

4.3 문자열이 메모리에 저장되는 구조

  • 문자열은 크기가 제각각일 경우가 많아 마지막이 어딘지 표현하기 위해 배열의 마지막 칸에 null character ('\0')를 집어넣음
#include <stdio.h>

int main()
{
	int a = 1;
	int int_arr[10] = { 0,1,2,3,4,5,6,7,8,9 };	// 수배열의 값 초기화

	printf("%i %i %i\n", int_arr[0], int_arr[1], int_arr[9]);	
    // 배열의 각 값들에 접근, 배열의 첫번째 index는 0
																
	return 0;
}

 

Output : 
0 1 9

 

 

#include <stdio.h>

int main()
{
	char c = 'a';
	char str1[10] = "Hello";	// 문자열 초기화시는 큰따옴표 사용. Hello + '\0' -> 총 6글자
	char str2[10] = { 'H','i' };

	printf("%c\n", c);
	printf("%s\n", str1);		// 문자열을 한글자씩 출력하다 null character를 만나면 출력을 멈춤
	printf("%s\n", str2);
	
	printf("%hhi %hhi %hhi %hhi %hhi\n", str2[0], str2[1], str2[2], str2[3], str2[4]);
	// null character 뒤에 있는 index 3부터는 0 출력
    
	return 0;
}

 

Output : 
a
Hello
Hi
72 105 0 0 0

 

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	char str3[20] = "Hello, \0World";		
	printf("%s\n", str3);				
    // null character 뒤의 문자가 메모리에 저장은 되나 출력되지 않음 ->
    // printf문은 null character를 만나면 출력을 멈추기 때문

	printf("%c\n", str3[10]);			
	printf("%c\n", str3[11]);

	return 0;
}

 

Output : 
Hello,
r
l

 

4.4 strlen() 함수

  • strlen = string length
#include <stdio.h>
#include <string.h>		// strlen 을 비롯한 문자열에 관련한 함수들 사용을 위한 library 

int main()
{
	char str1[100] = "Hello";
	char str2[] = "Hello";		// index를 입력받은 문자 + 1 만큼으로 맞춤
	char str3[100] = "\0";
	char str4[100] = "\n";
	char str5[100] = " \n";

	printf("%zu %zu\n", sizeof(str1), strlen(str1));	
	printf("%zu %zu\n", sizeof(str2), strlen(str2));
	printf("%zu %zu\n", sizeof(str3), strlen(str3));	
	printf("%zu %zu\n", sizeof(str4), strlen(str4));	
	printf("%zu %zu\n", sizeof(str5), strlen(str5));
	// sizeof는 문자열의 크기, strlen은 null character를 제외한 글자수 출력
    
	return 0;
}

 

Output :
100 5
6 5
100 0	-> strlen()은 null character를 세지 않음
100 1	-> escape sequence는 두 문자가 하나의 글자처럼 작동하여 하나의 ASCII Code에 대응함
100 2	-> 공백(space)도 ASCII Code 값이 있음

 

 

#include <stdio.h>
#include <string.h>		// strlen 을 비롯한 문자열에 관련한 함수들 사용을 위한 library 

int main()
{
	char* str5 = (char*)malloc(sizeof(char) * 100);
	str5[0] = 'H'; str5[1] = 'e'; str5[2] = 'l'; str5[3] = 'l'; str5[4] = '0'; str5[5] = '\0';

	printf("%zu %zu\n", sizeof(str5), strlen(str5));
	// sizeof(str5) -> pointer 변수 자체의 size. pointer 변수는 크기가 int와 같음

	return 0;
}

 

Output : 
4 5

 

 

4.5 기호적 상수와 전처리기

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main()
{
	float radius, area, circum;

	printf("Input radius\n");

	scanf("%f", &radius);

	area = 3.141592f * radius * radius;		// area = pi * r * r
	circum = 2.0 * 3.141592f * radius;		// circm = 2.0 * pi * r
	
	printf("Area is %f\n", area);
	printf("Circumference is %f\n", circum);

	return 0;
}
  • 위처럼 계산시마다 리터럴 (3.141592)를 입력하는 것은 비효율적이고 실수도 나오기 쉬움
Output : 
Input radius
2.0 입력 ->
Area is 12.566368
Circumference is 12.566368

 

  • 전처리기를 사용하여 3.141592f를 PI로 대체
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#define PI 3.141592f	// 전처리기가 PI가 있는 부분을 3.141592f로 바꿈 -> 컴파일러 입장에서는 
			// PI가 3.141592f가 된 상태에서 컴파일을 함
            
#define AI_name "Mark"	// 전처리기에 선언되어 있는 변수명을 바꿈으로써 코드에 있는 같은 변수명 
			// 여러개를 한번에 바꿀 수 있음
int main()
{
	// const float pi = 3.141592f;	// 기호적 상수 선언시 main문에서 const를 이용하여 선언 가능
    					// 변수의 값을 바꾸지 못하게 함	
					// 최근에는 const를 이용하여 기호적 상수를 선언하는 방법을 권장함
	float radius, area, circum;

	printf("I`m %s\n", AI_name);
	printf("Please Input radius\n");

	scanf("%f", &radius);

	area = PI * radius * radius;		// area = pi * r * r
	circum = 2.0f * PI * radius;		// circm = 2.0 * pi * r

	printf("Area is %f\n", area);
	printf("Circumference is %f\n", circum);

	return 0;
}
  • 원래 리터럴이(3.141592f) 있던 자리에 기호(PI)를 집어넣어 사용하므로 기호적 상수라고 부름
Output :
I`m Mark
Please Input radius
2.0 입력 ->
Area is 12.566368
Circumference is 12.566368

 

 

 


강의 출처 : https://www.inflearn.com/course/following-c/dashboard

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com