목차
21.문자열
22.프로젝트
21.문자열
문자열을 배열로 만들어보겠습니다.
char str[6] = "coding"; // [c] [o] [d] [i] [n] [g]
printf("%s\n", str);
이상한 값이 출력됩니다.
왜 그럴까요?
바로 문자열 끝에는 끝을 의미하는 NULL문자 (\0)을 써줘야 하기 때문입니다.
그런데 coding 은 6글자 라서 6칸이 필요한데 어떻게 하면될까요?
그냥 간단하게 배열을 1칸 더 추가해주시면 됩니다.
char str[7] = "coding";
// [c] [o] [d] [i] [n] [g] 끝에 자동으로 [\0] 값이 들어감
printf("%s\n", str);
return 0;
그럼 이제 한글과 영어의 문자열 차이점을 알아보겠습니다.
char str[] = "나도코딩";
char eng[] = "FOUR";
printf("%s\n", str);
printf("%d\n", sizeof(str));
printf("%s\n", eng);
printf("%d\n", sizeof(eng));
// 영어 1글자 : 1 byte
// 한글 1글자 : 2 byte
// char 크기 : 1 byte
// "나도코딩" > 8 byte + 마지막 \0 1 byte > 9 byte
정리하자면
문자열은 항상 마지막에 \0이 생략되어있고
한글은 2바이트 영어는 1바이트로 구성되어있습니다.
만약 공간이 넉넉하게 있으면 어떨까요?
char c_array[10] = { 'c','o','d','i','n','g' };
printf("%s\n", c_array);
for (int i = 0; i < sizeof(c_array); i++)
{
printf("%c\n", c_array[i]);
}
// 남는 공간있으면 문자의 끝이 자동으로 들어간다.
잘 나오는걸 확인할 수 있고, 남는 공간에는 문자의 끝(\0)이 들어가는걸 알 수 있습니다.
앞으로 문자열을 배열로 선언할때 넉넉하게 사이즈를 잡으면 편하겠죠?
만약 출력을 %c 가 아닌 %d 로 하게되면 어떻게될까요?
char c_array[10] = { 'c','o','d','i','n','g' };
printf("%s\n", c_array);
for (int i = 0; i < sizeof(c_array); i++)
{
printf("%d\n", c_array[i]); // Ascll 코드 값 출력 (null 문자는 0으로 표시됨)
}
ASCII 코드 값이 나오는걸 알 수 있습니다.
ASCII 코드는 무엇일까요?
ANSI (미국표준협회)에서 제시한 표준 코드 체계입니다.
7비트로 표시 할 수 있고, 128개의 코드를 가지고있습니다.
0부터 128까지 숫자로 표시합니다.
예) a 는 97 , A는 65
초창기에는 많은 방법으로 문자열을 표현했었는데 국가별로 호환이 안되던 문제를
해결하기 위해 ANSI (미국표준협회)에서 ASCII라는 체계를 제시를 했습니다.
그래서 ASCII 공용어가 되었습니다.
printf("%c\n", 'a');
printf("ASCII : %d\n", 'a');
printf("%c\n", 'b');
printf("ASCII : %d\n", 'b');
printf("%c\n", 'A');
printf("ASCII : %d\n", 'A');
printf("%c\n", '\0');
printf("ASCII : %d\n", '\0');
printf("%c\n", '0');
printf("ASCII : %d\n", '0');
printf("%c\n", '1');
printf("ASCII : %d\n", '1');
아스키 코드 전체를 출력하는 코드입니다.
for (int i = 0; i < 128; i++)
{
printf("아스키 코드 정수 %d : %c\n", i, i);
}
22.프로젝트
발모제 4개에서 1개의 발모제만 머리가 자라는 발모제를 맞추는 게임을 만들어 봅시다.
srand(time(NULL));
printf("\n\n === 아빠는 대머리 게임 === \n\n");
int answer; // 사용자 입력값
int treatment = rand() % 4; // 발모제 선택 (0 ~ 3)
int cntShowBottle = 0; // 이번 게임에서 보여줄 병 갯수
int prevCntShowBottle = 0; // 앞 게임에 보여준 병 갯수
// 서로 보여주는 병 갯수를 다르게 하여 정답률 향상
// (처음 2개 -> 3개..)
// 3번의 기회
for (int i = 1; i <= 3; i++)
{
int bottle[4] = { 0,0,0,0 }; //4개의 병
do {
cntShowBottle = rand() % 2 + 2; // 보여줄 병 갯수 (0~1, +2 -> 2, 3)
} while (cntShowBottle == prevCntShowBottle);
prevCntShowBottle = cntShowBottle;
int islncluded = 0; // 보여줄 병 중에 발모제가 포함되었는지 여부 (1 : 포함)
printf(" > %d 번째 시도 : ", i);
// 보여줄 병 종류 선택
for (int j = 0; j < cntShowBottle; j++)
{
int randBottle = rand() % 4;
// 아직 선택되지 않은 병이면, 선택처리
if (bottle[randBottle] == 0)
{
bottle[randBottle] = 1;
if (randBottle == treatment)
{
islncluded = 1;
}
}
// 이미 선택된 병이면, 중복이므로 다시 선택
else
{
j--;
}
}
// 사용자에게 문제 표시
for (int k = 0; k < 4; k++)
{
if (bottle[k] == 1)
printf("%d ", k + 1);
// 자료를 셀때 0부터 세기때문에 0번째가 아닌 1번째 라고 말하기 위해서
}
printf(" 물약을 머리에 바릅니다. \n\n");
if (islncluded == 1)
{
printf(" >> 성공 ! 머리가 났어요 ! \n");
}
else
{
printf(" >> 실패 ! 머리가 나지 않았어요..\n");
}
printf("\n ... 계속 하려면 아무키나 누르세요...");
getchar(); // 아무키나 누를때까지 대기
}
printf("\n\n 발모제는 몇 번 일까요? ");
scanf_s("%d", &answer);
if (answer == treatment + 1)
{
printf("\n >> 정답!\n");
}
else
{
printf("\n >> 땡! 틀렸습니다. 정답은 %d 입니다.\n",treatment + 1);
}
'C' 카테고리의 다른 글
C언어(9) (0) | 2024.11.19 |
---|---|
C언어(8) 기초8 (0) | 2024.11.18 |
C언어(6) 기초6 (0) | 2024.11.13 |
C언어(5) 기초5 (0) | 2024.11.12 |
C언어(4) 기초4 (0) | 2024.11.11 |