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
'Study_C, C++ > 홍정모의 따라하며 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 4.9 printf() 함수가 인자들을 해석하는 과정 (0) | 2021.08.19 |
---|---|
[홍정모의 따라하며 배우는 C언어] 4.6 명백한 상수들 ~ 4.8 변환 지정자의 수식어들 (0) | 2021.08.18 |
[홍정모의 따라하며 배우는 C언어] 3.13 불리언형 ~ 4.2 sizeof 연산자 (0) | 2021.08.13 |
[홍정모의 따라하며 배우는 C언어] 3.11 부동소수점형 ~ 3.12 부동소수점형의 한계 (0) | 2021.08.12 |
[홍정모의 따라하며 배우는 C언어] 3.9 고정 너비 정수 ~ 3.10 문자형 (0) | 2021.08.10 |