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

이2님의 프로필 이미지
이2

작성한 질문수

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

6.1 while 반복 루프에서 scanf()의 반환값 사용하기

q to quit

작성

·

708

0

q를 입력해야만 끝나고 다른 문자열을 입력했을때는 안끝나고 싶어서 이리저리 해봣는데... q라고해도 결국 정수113과 q를 컴퓨터는 같은 것으로 인지하기 때문에 실패했습니다.

선생님이 보여준 강의예제에서는 q말고도 다른 문자 즉 int(%d)로는 받을 수 없는 문자를 입력했을 때 어떤 문자든 종료가 되었습니다. %d로 받았기 때문에 문자가 자동으로 정수화가 이루어지지 않는 것 같은데 이것은 'q' 버튼 하나만을 종료로 만들기에는 어려움이 있네요...

만약 받은 것을 불러와서 while문 조건으로 비교 할때 내가 입력한 것을 문자인지 숫자인지 확인이 가능하면 좋겠습니다. 이런방법이 있을까요??
그리고 선생님 이전강의에서 형식지정자 %c는 printf 에서는 문자로 출력하고 숫자로출력하려면 %hhd를 이용해야해서 %hhd로 스캔f받아봤지만 이것도 아니네요 ㅠㅠ

답변 2

0

이2님의 프로필 이미지
이2
질문자

친절한 설명 너무감사드립니다~ 강의 뒷내용 좀더 공부하고 다시돌아와서 한번더 해볼게요!! 친절한 답변 정말감사드려요

0

안녕하세요! 

오로지 다른 문자 말고, 문장도 말고 q 하나만 입력이 들어와야 종료가 되게끔 하고 싶으신게 맞을까요?

1. scanf("%d") 입력에 실패했다는 것은 정수가 아닌 것을 입력했다는 의미입니다. scanf("%d", &num) 즉, 입력 받은 것이 숫자가 아니라서 num 입력에 실패하면 0 을 리턴하죠. num에 입력 되지 않은것은 시스템 내의 입력 버퍼에 그대로 남아있게 됩니다. 에를 들어 숫자를 입력하지 않고 abcd를 입력하면 이는 숫자가 아니므로 num에 입력되지 않고 무시되며 시스템 내부의 입력 버퍼에는 그대로 a b c d \n 이렇게 5 개의 문자가 들어가 있는 상태가 됩니다. 질문자님께서는 오로지 q 한 문자를 입력했을 때 종료시키고 싶으신것이니까 scnaf 정수 입력을 실패한 후에  입력 버퍼에서 char 문자를 가져와 읽는 작업을 해야 합니다.  1️⃣ 입력 버퍼의 가장 첫문자가 'q'여야 한다. 2️⃣ q 이외엔 \n 만 있어야 한다.(즉 quwieui 이런 q로 시작하는 문자열이 아닌 오로지 q 하나만 입력해서 버퍼엔 q \n 두개 문자만 들어있는 상태)  여야 한다는 조건이 필요합니다. 이 두개의 조건을 만족시키면 while문을 종료시키도록 하면 될 것입니다. 이땐 getchar() 등등 버퍼로부터 한 문자씩 빼오는 여러 입력 함수들을 사용할 수 있습니다. 질문자님께서 지금 6챕터 강의 듣는 이 시점에서는 제가 설명드린 입력 버퍼 개념이나 getchar() 이런것도 생소하실 것 같아요. 그래서 이 문제는 적어도 <7.2 표준입출력 강의>까지 공부 하신 후에 다시 고민해보셨으면 좋겠습니다. 지금까지 배운 단계만으로는 질문자님께서 원하는 그림을 구현하기 힘드실 것 같습니다. 추후 강의에서 입력 버퍼나 다른 입력 함수들에서 학습 하고 나면 구현하실 수 있을거에요!

제가 짜 본 코드입니다. 가독성 좋게 짜여진 것 같진 않아서 죄송하지만 ㅠ ㅠ 코드에 대한 설명은 주석으로 대신하겠습니다. 지금 이해 안되셔도 표준 입출력 함수와 입력 버퍼 공부하신 후에 다시 보시면 이해 되실지도 몰라요!

2. 위 방법은 "1223fkldkf" 이런식으로 입력하는건 또 필터링 하지 못해요. 앞에 1223 까지가 num으로 입력되어버려서..ㅠㅠㅠ  그래서 아예 scanf 를 쓰지 않고 fgets 같은 문자열 입력 함수로 '문자열'로서 전체를 받아서 이를 q 와 비교하고 q 가 아니면 문자열 원소들을 정수로 변환하여 10진 정수로 만들어 계산하는 구현 방법도 있을 것 같습니다. 이런 방법 역시 문자열 함수들에 대해서 배우는 11챕터까지 공부하신 후에 고민해보실 수 있을 것 같습니다.

이2님의 프로필 이미지
이2

작성한 질문수

질문하기