C

C언어(7) 기초7

사회적가치누리 2024. 11. 16. 14:41
목차
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