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

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

이승환님의 프로필 이미지
이승환

작성한 질문수

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

7.7 논리 연산자 Logical operators

글자 세기에서 엔터값 빼는 예제 질문있습니다.

작성

·

194

1

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include<ctype.h>

#include<stdbool.h>

#include<iso646.h>

#define PERIOD '.'

int main()

{

char ch;

int count = 0;

while ((ch = getchar() != PERIOD))

{

if (ch == '\n')

count--;

else

count++;

}

printf("%d", count);

return 0;

}

선생님처럼 \n가 아닐때만 세라는 프로그램이아닌 \n이면 -1하고 아니면 +1하라라는 프로그램을 만들었는데 빌드값이 엔터를 포함해서 나오더라고요.. 어떤 부분에서 실수했는지 궁금합니다..

답변 2

1

안녕하세요.

우선 질문자님 코드로만 놓고 봤을 때 문제점은

while ((ch = getchar() != PERIOD)) 이 부분입니다.

ch = getchar() 가 먼저 실행되야 하는데, = 의 낮은 연산순위로 인하여 getchar() != PERIOD 가 먼저 실행됩니다. 따라서 이 조건식의 결과가 ch 에 들어가게 되므로 ch에는 1 아니면 0 만 들어가게 됩니다. 그래서 잘못된 결과가 나오셨을거에요. 

ch = getchar() 부분을 소괄호로 묶어주어 먼저 실행되게 해야합니다.

while( (ch = getchar() ) != PERIOD)

-

우선 코드의 문제점을 답변 드려봤는데 빌드값이 엔터를 포함한다는게 어떤 말씀인지 조금 이해가 가지 않습니다. 위 답변으로 문제가 해결되지 않으셨다면 우선 디버깅으로 문제점을 찾아보시는게 좋을 것 같아요! 그래도 해결되지 않으신다면 입력을 어떤걸로 하셨을 때 어떤 결과를 기대하였는데 어떻게 나오셨다는 좀 더 구체적인 예시를 답댓으로 달아주시면 감사하겠습니다!

0

while ((ch = getchar()) != PERIOD)  이거랑

while (ch = getchar() != PERIOD)  이거랑

joy님이 말씀하신대로 .연산자 우선순위땜에 에러나네요..

continue로 했는데 왜 안되나보니깐.. 저거땜요...

감사합니다.. 한수배웁니다 ~

이승환님의 프로필 이미지
이승환

작성한 질문수

질문하기