인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

junghoyoung8님의 프로필 이미지
junghoyoung8

작성한 질문수

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

7.2 표준 입출력 함수들 getchar(), putchar() 예제

질문드립니다.

작성

·

334

0

질문1.

char ch;

while((ch = getchar()) != '\n')

{

putchar(ch);

}

putchar(ch);

return 0;

return 위의 putchar는 입력된 값들이 출력이 된 이후에 줄바꿈을 위해서 있다고 생각하면 되나요? 실행 결과 있을때는 줄바꿈이 되고 없을때는 줄바꿈이 안되더라구요.

질문2.

char ch;

while ((ch = getchar()) != '\n')

{

if (ch >= '0' && ch <= '9') // && = and

ch = '*';

putchar(ch);

}

putchar(ch);

여기에서 if문 안의 0과 9를 문자로 받아 들이는 이유가 궁금 합니다.(getchar가 한 글자씩 입력받기 때문인가요?)

입력되는 값의 자료형을 int ch로 바꾸었을때도 실행은 잘 되더라구요. 그런데 if문 안의 0과 9에 ' '을 지우고 실행을 하였을 경우 *로 바뀌지 않더라구요.

답변 1

1

안녕하세요 답변 도우미입니다.

1. 네 그렇게 생각하셔도 됩니다. ch 에 '\n' 이 들어올 때 while문이 종료가 되겠죠? '\n'이 아닐 때만 while문을 도니까요! 그래서 while문이 종료되고 나면 ch 값은 '\n' 입니다. 사진에서 확인하실 수 있습니다. (노란 화살표 부분일 때 ch 값이 '\n'입니다.) 콘솔창에 입력을 하고 엔터를 딱 치면 입력 값만 버퍼에 들어가는 것이 아니라 이 엔터까지도 버퍼에 같이 들어가게됩니다. 이 엔터(개행문자 '\n')도 엄연히 아스키코드를 가진 '문자'이니 char 인 ch 변수에 저장이 될 수 있습니다.  

2. 제가 이 질문은 잘 이해가 되진 않는데 0과 9를 왜 문자로 '0', '9' 로 if 문에 넣었냐는 말씀과도 같을까요? ch 는 char 문자죠! 그리고 char 변수는 문자를 아스키코드 정수로 저장한다는 것을 앞에서 배우셨을 것입니다. 그러니 ch >= '0' 이 아닌 ch >= 0 의 의미는 아스키코드 값이 0 이상인 것을 의미하는 것입니다. 우리가 의도하려는 그 숫자 0 을 의미하는 것이 아니구요! 아스키코드 값 0 을 의미하는 것이에요. char 는 문자이기에 '0' 이라고 적어주셔야 생각하는 방향대로 결과가 도출될 수 있습니다. 여담으로 '0' 은 (문자로서의 0) 아스키코드값이 48 인가 그랬던걸로 압니다 ㅎㅎ 그래서 ch >= '0' 은 곧 ch >= 48 과도 같습니다.

int ch; 로 선언하셔도 어차피 getchar() 는 입력 받은 문자(아스키코드 "정수")를 리턴하니 별 문제 없습니다.  '0' '9' 가 아닌 그냥 0, 9 의 의미는 앞서 말씀드린것처럼 문자로서의 0, 9 가 아닌 아스키코드 정수값 0, 9 를 의미하게 됩니다. 그래서 그냥 0, 9 로 하면 * 가 출력되지 않은 것이에요. 예를 들어 2를 입력햇다면 2의 아스키코드 값은 50 이라 0과 9에 속하지 않기 떄문입니다. 반면 '0', '9' 는 아스키코드로 48 ~ 58 이니 2는 이곳에 속하므로 * 가 출력되는 것이구요.

제가 위 사진처럼 디버깅을 통해 ch 메로리를 들여다 보았는데 질문자님께서도 공부하실 때 디버깅 병행하시면서 직접 값 확인해보시면 이해에 더 도움이 되실 것입니다. 디버깅 꼭 해보시길 추천드립니다. 

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

항상 원하는 답변을 주셔서 감사합니다.

디버깅하면서 보았는데 아스키코드의 숫자는 지나치면서 봤었나봐요.

앞으로 세세하게 보면서 공부해야 될거같네요. 

좋은 답변 감사합니다.

junghoyoung8님의 프로필 이미지
junghoyoung8

작성한 질문수

질문하기