1. 행맨 게임 제작
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int check(char s[], char a[], char ch);
int main(void)
{
char solution[10][100] = { "in car", "at noon", "a boy" }; // 문제
int nstr = 3; // 문제 개수
char answer[10][100]; // 문제의 빈칸 표시 저장
int k, i, t, ind;
char op;
// 문제를 빈칸으로 바꾸어 출력
printf("문제:\n");
while (1)
{
for (k = 0; k < nstr; k++)
{
strcpy(answer[k], solution[k]);
i = 0;
while (solution[k][i] != NULL)
{
if (isalpha(solution[k][i]) != 0)
{
answer[k][i] = '_';
}
else answer[k][i] = ' ';
i++;
}
printf("%d. %s\n", k + 1, answer[k]);
}
Q:
if (nstr < 10)
{
printf("문자열을 추가하시겠습니까? (y/n)");
op = getchar();
getchar(); // 엔터 제거
if (op == 'y')
{
printf("정답 문자열을 입력하시오 (영문 100자 이내):");
gets(solution[nstr]);
strcpy(answer[nstr], solution[nstr]);
nstr++;
}
}
if (op == 'n' || nstr >= 10) break;
if (op == '1') exit(0);
}
printf("풀고싶은 문제의 번호를 입력하세요 (1-%d):", nstr);
scanf("%d", &ind); // 풀고 싶은 문제 번호를 ind에 저장
getchar(); // 엔터 제거
ind = ind - 1; // 배열 주소는 0부터 시작
t = 0;
int max = strlen(solution[ind]); // 문자열 길이를 최대 시도 횟수로 저장
while (1)
{
printf("%s \n", answer[ind]); // 추측결과 출력
printf("글자를 추측하시오:");
char ch = getchar();
getchar(); // 엔터 제거
t++;
if (t >= max)
{
printf("시도 횟수를 초과하였습니다.\n");
goto Q;
}
if (check(solution[ind], answer[ind], ch) == 1)
{
printf("%s: 정답입니다!\n", answer[ind]);
goto Q;
}
}
return 0;
}
int check(char s[], char a[], char ch)
{
int i;
for (i = 0; s[i] != '\0'; i++) // s[i] == '\0'이면 break
{
if (s[i] == ch)
a[i] = ch;
}
if (strcmp(s, a) == 0) return 1; // s[]와 a[]가 같으면 1을 반환
else return 0;
}
- 본인이 문제를 추가할 수 있다.
- 1을 입력하면 게임이 종료된다.
- 문자의 개수만큼 기회가 주어진다.
2. 포인터
#include <stdio.h>
int main()
{
int i = 10;
float f = 12.3;
int* pi = NULL; // 포인터의 타입을 변수와 일치시킨다.
float* pf = NULL;
// 포인터를 선언할 때, NULL로 초기화해 준다.
pi = &i; // 주솟값을 저장할 때, *가 붙지 않는다.
pf = &f;
printf("%u\t%u\n", &i, pi);
printf("%u\t%u\n", &f, pf);
// 같은 주솟값이 출력됨을 알 수 있다.
return 0;
}
포인터는 주소를 저장하기 위한 용도의 변수이다. 즉, 포인터도 변수의 일종이다.
어째서인지 주솟값은 출력할 때마다 변한다.
int* p = NULL; // 정수형 포인터의 선언, 포인터는 반드시 초기화
int* p = &i; // 포인터에는 주소를 저장한다.
int* p = 4; // 4는 값이 아니라 주소의 이름이다.
p = &i; // p라는 변수에 i의 주솟값을 저장한다.
*p = 4; // 포인터 앞에 *를 붙이면 주소가 아닌 주소 내부의 값을 받는다.