인프런 커뮤니티 질문&답변

Ad Astra님의 프로필 이미지
Ad Astra

작성한 질문수

홍정모의 따라하며 배우는 C언어

6.15 중첩된 루프들

scanf로 문제 계속 받고 나오는 방법

작성

·

284

0

int main()

{

const char first_char = 'A';

// const char last_char = 'T'; // TOOD: use scanf() / 즉 last_char(마지막글자)를 scanf로 입력받아서 쓸 수 있게 만들어봐

// const int num_rows = last_char - first_char + 1;

int r; // num_rows loop

int c; // character loop

char last_char = 'C'; 

for (last_char; last_char != 'q'; scanf("%c", &last_char))

{

printf("Input last_char (quit to q) : ");

scanf("%c", &last_char);

const int num_rows = last_char - first_char + 1;

for (r = 0; r < num_rows; ++r)

{

for (c = first_char; c <= first_char + r; ++c) // 

{

printf("%c ", c);

}

printf("\n");

}

for (r = 0; r < num_rows; ++r)

{

for (c = first_char + r; c != first_char + num_rows; ++c)

{

printf("%c ", c);

}

printf("\n");

}

printf("num_rows : %d, r : %d, first_char : %c, last_char : %c, c : %c\n", num_rows, r, first_char, last_char, c);

printf("\n");

}

입력 받는건 아주 잘 받는데 q 입력했을 때 바로 안나오고 엄청난 이상한 출력 길게 나오고 끝나네요.. 뭐가 문젠가요?

출력은 예제2번에 예제3번 합쳐서 나오고 끝나는 출력입니다.

ex)

A

AB

ABC

BC

C

답변 1

0

안녕하세요 :)

q 를 입력했을 떄 종료하게 하고 싶다면

이렇게 last_char 를 입력 받았을 때 q 면 break 하는 식을 중간에 넣어주어야 하지 않을까 싶습니다.

이렇게 미리 break 로 빠져 나가야 그 아래 연산들을 실행하지 않으니까요!

q 면 반복하지 않도록 하는 것을 for 문식에 써주셨는데, 입력은 for 문 내부에서 받고 있기 때문에 q 를 입력했더라도 그 아래 부분들이 전부 실행이 한번 될 수 밖에 없기에 그랬던 것입니다. q 가 입력되면 미리 break 되게끔 중간에 제가 체크한 빨간 코드를 끼워넣어 주세요~!

여담으로 소문자 q 를 입력했을 때 저런 출력이 나온 이유는 안쪽 for문에서 출력을 num_rows 번 하시는데 이를 last_char - first_char + 1; 로 설정하셨는데요, first_char 가 'A' 대문자로 설정되어 있기 때문입니다. 소문자는 아스키코드가 대문자보다 더 크니까 .. 예를 들어 소문자 q 의 아스키 코드는 113, A 의 아스키코드는 65 니까 소문자 q 를 입력한 경우에는 num_rows 이 48 이나 되네요! 그래서 저런 출력 결과가 나온거구요! 이런 경우가 발생하지 않게끔 q 입력된게 확인되면 바로 break 되게끔 해주세요 

Ad Astra님의 프로필 이미지
Ad Astra

작성한 질문수

질문하기