saguaro   1년 전

getchar();가 문젠가 싶어 37열을 주석처리하면 콘솔창이 m, n만 입력해도 쇽 사라지고

주석처리 안하면 가로 세로 크기만 입력해도 갑자기 출력이 나옵니다.

이유가 뭘까요...?

(그 외에 코드에 대한 지적도 감사하겠습니다.)

seawon0808   1년 전

변수를 잘못된 자료형으로 선언한 것과 입력 받는 것에 문제가 있습니다.

saguaro   1년 전

char 선언한 것들은

n : 가로. 문제에서 50을 넘지 않는다고 정해줌

m: 세로. 이하 동문

count들: 8*8을 넘지 않는 수

chess[50][50]: 문자열 입력 받을 배열

int 선언한 것들도 범위 안 넘을 것 같음

for (i = 0; i < m; i++) //행
   for (j = 0; j < n; j++) //열
      scanf("%s", &chess[i][j]); //입력 받기

이렇게 입력 받아도 똑같음


이런 상황인데 뭐가 문제인지도 혹시 알려주실 수 있으신가요..? ㅠ

seawon0808   1년 전

변수 선언에 대한 것은 제가 잘못 봤네요.

하지만 입력 받는 것에서는 확실히 문제가 있습니다.

그리고 왜 코드에는 scanf("%s", &chess[i][j]); 라고 되어있는데 작성자 님은 scanf("%s", chess[i][j]); 로 입력을 받았다고 하죠?

질문을 올릴 때는 무조건 백준에 제출한 똑같은 코드를 올려주세요.

saguaro   1년 전

아 답변자님 말씀 보고 & 넣어서 해봤는데도 안 돼서 그렇게 댓글을 적었습니다.

본문에서도 수정을 할게요

seawon0808   1년 전

%s에 대해서 알아보세요.

saguaro   1년 전

계속 답 달아주셔서 감사합니다ㅜㅠ

%s는 문자열 지정자라 공백없는 BWBWBWBW 같은 입력은 한 개로 쳐서 그 다음으로 안 넘어간다는 말씀이신 걸로 알아들었습니다.

scanf("%c", &chess[i][j]); 로 바꿔보았는데도 계속 입력을 안 먹어주고 바로 출력으로 가버리는데 또 문제를 찾아달라하면 너무 칭얼대는 것이겠죠..?

디버그를 위해 %1d 로 바꿔 체스판 알맹이(BW)를 숫자로 입력해보고자 하는 시도도 아예 안 먹히고 n, m만 받고나면 스캔을 전혀 안해줘서 모든 걸 때려치고 싶은 오후가 되어 다시 댓글을 달게 되었습니다...

😥😥😥

saguaro   1년 전

뭐가 문젤까 계속 바꿔보다가 이런 상황을 발견했습니다.

이게... 원인이 무엇인지............

seawon0808   1년 전

%1d로 입력 받은 코드를 올려주실 수 있나요?

adung7   1년 전

scanf("%d %d", &m, &n); //행 열 

for (i = 0; i < m; i++) //행 

    for (j = 0; j < n; j++) //열 

        scanf(" %c", &chess[i][j]); //입력 받기

%c는 입력을 받을때 '\n' 즉 엔터까지 입력을 받기 때문에 중간에 원하지않은 개행문자('\n')가 chess배열에 저장되게 되어 원했던 입력보다 일찍 종료하게 되는것입니다 해결방안은 위에 적어둔대로 %c앞에 공백을 하나 추가해서 입력받으시면 해결됩니다.

saguaro   1년 전

seawon0808

두번째 올렸던 댓글의 예시에서 입력을 안 먹어주는 이유가 char 자료형을 %d로 입력받아 영역 침범 때문에 그렇다는 것을 어떤 분께서 알려주셔서 %hhd로 m, n을 입력받고 해결이 되었습니다. 

그 이후로는 체스판 배열 입력을 %c로 받든 %1d로 받든 아예 제 입력을 무시하는 출력은 나타나지 않게 되었습니다.

같이 답 찾아주려 노력해주셔서 감사합니다!!


adung7님 저는 지금 절을 하고 있습니다. 공백%c를 하자마자 해결되었습니다. 쉬운 예제라고 생각했다가 몇 시간을 해결 못하는 자신에게 환멸을 느끼고 있었는데 지금 열 올랐던 뇌에 바람이 부는 것 같습니다. 진짜 정말 매우 감사드립니다.

(그런데 공백%c가 반복문에 들어가있으니

체스판 입력은 행이 바뀌기 전까진 공백이 없어 개행문자나 띄어쓰기가 되어있지 않은데

이게 왜 작동하는지 완전한 이해가 되지 않아 조금 찝찝합니다.... 백지 뇌에게 한번만 더 가르침을 주시면... 감사하겠습니다...)

seawon0808   1년 전

제가 답해도 되는지도 모르겠고 saguaro님을 잘 이해한 건지는 몰라도 예제 입력 1을 보면  8 8 다음에 줄바꿈이 있어서 처음 W(2번째 줄의 1번째 글자) 를 " %c"로 입력 받아도 되는 것입니다.

오히려 첫 번째 체스판 글자를 공백 없이 입력 받으면 틀렸다고 나올겁니다. 

saguaro   1년 전

네 첫번째 체스판 문자를 공백%c로 받는 것은 이해를 했었습니다!

제가 의문인 점은 예를 들면 

WBWBWBWB 여기서 B(두번째 문자)부터는 앞에 개행문자나 공백이 없으니 둘 중 하나를 받을 때까지 문자 입력을 안 받게 되는 게 아닌가 생각했었습니다.
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

seawon0808   1년 전


adung7   1년 전

%c 앞에 공백을 넣어주면 공백이 있을거라 생각하고 입력을 받겠다는게 아니라 공백문자가 입력으로 들어오면 그건 무시하고 입력을 받겠다 하는것이기 때문에 그렇습니다

saguaro   1년 전

이해됐습니다! 두 분 다 감사합니다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!🤗

댓글을 작성하려면 로그인해야 합니다.