함수 res, can부분에서 처음에 scanf로 입력받을 때 예를들어 B3이라고 입력하면
B만 r_A에 제대로 들어가고 3은 r_i에 안들어가요 ㅠㅠㅠㅠㅠㅠ
그냥 처음에 초기화한대로 0만 계속 나와요.. 왜이런건지 알 수 있을까요..? ㅠㅠ
프로그램은 5x5배열인 영화관에서 예매하는 프로그램이예요! 0이면 자리 있고, 1이면 자리 없음..
저 문제만 해결하면 바로 돌아갈텐데 미치겠네요 진짜..
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
int i, j, k;
void chk(int seat[][5])
{
printf(" \t0\t1\t2\t3\t4\n");
for (i = 0; i < 5; i++)
{
printf("%c", i + 65);
for (j = 0; j < 5; j++)
{
printf("\t%d", seat[i][j]);
}
printf("\n");
}
}
void res(int seat[][5])
{
char r_A;
int r_i = 0;
rewind(stdin);
printf("예매할 번호를 입력하세요(ex.A0, a0) : ");
scanf_s("%c %d", &r_A, &r_i);
int r_a = r_A - 65;
if (seat[r_a][r_i] == 0)
{
printf("예매가 완료 되었습니다.\n");
seat[r_a][r_i]++;
chk(seat);
}
else if (seat[r_a][r_i] == 1)
{
printf("예매 할 수 없는 좌석입니다.\n");
}
rewind(stdin);
}
void can(int seat[][5])
{
char r_A;
int r_i = 0;
rewind(stdin);
printf("예매 취소할 번호를 입력하세요(ex.A0, a0) : ");
scanf_s("%c%d", &r_A, &r_i);
int r_a = r_A - 65;
if (seat[r_a][r_i] == 1)
{
seat[r_a][r_i]--;
printf("취소가 완료 되었습니다.\n");
chk(seat);
}
else if (seat[r_a][r_i] == 0)
{
printf("취소 할 수 없는 좌석입니다.\n");
}
rewind(stdin);
}
int main()
{
int seat[5][5] = { 0, };
srand((long)time(NULL));
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
seat[i][j] = rand() % 2;
}
}
int num = 0;
do
{
printf("\n메뉴를 선택하세요. 예매(1), 예매 취소(2), 조회(3), 종료(0) : ");
scanf_s("%d", &num);
switch (num)
{
case 1:
{
chk(seat);
res(seat);
break;
}
case 2:
{
chk(seat);
can(seat);
break;
}
case 3:
chk(seat);
break;
}
} while (num != 0);
return 0;
}
해당 댓글은 삭제되었습니다.
%c %d이면 될텐데
%c는 어처피 한글자니까 한글자로 알아먹음. 내 테스트할땐 되는데 저분 케이스에선 왜 안될까
저 돌아갑니다 이제 진짜 감사합니다 ㅠㅠㅠㅠㅠㅠㅠㅠ
띄어쓰기문제였음? 뭐지 나도좀알자
printf해서 "%c %d", B, 3 인자로 줘보면 B3이라고 안나오고 B 3이라고 나올테지 - dc Cpp
단순히 생각해서 scanf도 결국 입력 들어올거 서식을 지정해주는건데 맞춰야지 않겠노 - dc Cpp
그런거 상관없이 B,3 정확하게 들어오던데? scanf("%c %d", &a, &i); 로하던 scanf("%c%d", &a, &i);
어처피 %c는 한글자만 파싱하니까
c++로해서 되는건가 아 내혼란함만 더커졌다
아까 착각했나봐요; 왜 안돌아가지..? 띄어쓰기 상관없이 그냥 아에 안돌아가요
아니 그니까 r_i가 계속 0인데 뭐지 대체?;;;
한글자씩 해보고 돌아가는지 안돌아가는지 해보셈.
생각해보니 그러게 이상하네 - dc Cpp
한 글자씩 입력해도 걍 0이네요..
나는 님코드 그대로 실행중인데 잘됨
실행환경이문제가있나ㅣ
메뉴를 선택하세요. 예매(1), 예매 취소(2), 조회(3), 종료(0) : 1 0 1 2 3 4 A 1 1 1 1 0 B 1 1 1 1 1 C 0 1 0 0 1 D 0 0 1 0 1 E 1 0 0 1 1 예매할 번호를 입력하세요(ex.A0, a0) : A1 A 1예매 할 수 없는 좌석입니다.
A1 둘다 정확하게 들어옴
그리고 조회부분 버그있음. 메뉴선택부분 입력부분에 이상한값 넣으면 무한루프돌아감 엌ㅋㅋ
한가지 다른점은 scanf_s와 scanf 차이인데 scanf로 테스트해보셈
아 사이즈 안적어줬네ㅡㅡ - dc Cpp
scanf_s는 크기도 적어줘야되는구나 지식이늘엇다
하긴 오버플로우막으려고하는건데..
결국 넘겨준 주소값도 숫자라서 함수가 뒤 주소값을 사이즈로 인지했을 가능성이 커보이네. - dc Cpp
계속 댓글 읽는데 무슨 말인지 이해가 제대로 안되네요 ㅠㅠ 블로그 글 정독해보고 오겠습니다!
인자를 줄 때 %c나 %s는 사이즈가 필요함. %c %d라면 인자 순서는 char, size, int 순서. - dc Cpp
그럼 %d는 사이즈 필요없음?
r_a, 1, r_i. 정수는 정해져있지만 문자열은 길이를 예측할 수 없으니까. 왜 %c도 받는진 모르겠음 - dc Cpp
그러게 찾아봐야겠다
저 일단 scanf_s("%c%d", &r_A, 1, &r_i); 로 만들어서 문제 해결했습니다! 관련된 내용은 아직 완전히 이해가 안되네요 ㅠㅠ 그래도 여러분들 덕분에 지식도 늘고 과제대로 해결하고갑니다! 감사합니다 ㅠㅠㅠㅠㅠ
https://stackoverflow.com/questions/41199504/reading-a-character-with-scanf-s
찾았다 게이야 - dc Cpp
%c가 여러글자도 읽을 수 있음?
char c[4]; scanf_s("%4c", c, (unsigned)_countof(c)); 이게 되는구나
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=msvc-160
출처
B 3 - dc Cpp