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

sjjeon17님의 프로필 이미지

작성한 질문수

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

7.8 단어 세기 예제

교수님 if(isspace(c)) 대신 if(isspace(c)==true)를 쓰면 안되나요?

20.12.16 15:30 작성

·

367

0

#include<stdio.h>

#include<ctype.h>

#include<stdbool.h>

#define stop '.'

int main()

{

char c;

int n_chars = 0;

int n_lines = 0;

int n_words = 0;

bool word_flag = false;

bool line_flag = false;

printf("Enter text :\n");

while ((c = getchar()) != stop)

{

if (isspace(c) == false)

n_chars++;

if (isspace(c) == false && line_flag == false)

{

n_lines++;

line_flag = true;

}

if (c == '\n')

line_flag = false;

if (isspace(c) == false && word_flag == false)

{

n_words++;

word_flag = true;

}

if (isspace(c)==true)

word_flag = false;

}

printf("Characters =%d, words %d, lines %d \n", n_chars, n_words, n_lines);

return 0;

}

  if(isspace(c)==true)에서 스페이스가 입력되어도 word_flag=false; 를 실행안하는 이유가 뭔지 궁금합니다...

답변 2

4

안소님의 프로필 이미지

2020. 12. 16. 20:55

- 위 출력 결과로 알 수 있다시피 true의 정수값은 1입니다. 문자긴하지만 사실 저장은 아스키코드 정수 값을 저장하고 있는 char 처럼 true, false 또한 저장은 각각 1, 0 형태로 됩니다. 

- isspace는 리턴타입이 int 정수인 함수니다. 또한 isspace 문서 에 따르면 "파라미터가 공백 문자일땐 0이 아닌 수를 리턴하고, 공백문자가 아닐땐 0을 리턴한다"라고 하네요! 공백문자일 때 꼭 1을 리턴하는게 아닙니다. 단순히 0 이 아닌 수를 리턴한다고 나와있습니다.

공백이 아닌 'a' 를 c에 입력하니 isspace(c) 가 0 을 출력하는 것을 확인할 수 있네요!

그런데 이렇게 공백을 c에 입력하니 isspace(c) 결과로 쌩뚱맞은 8 이 출력되는 것을 볼 수 있습니다. 

비주얼 스튜디오 말고 다른 컴파일러를 사용해보았는데 여기선 공백을 입력하니 isspace(c) 결과 값이 8192 였습니다. 

공백 문자를 파라미터로 넣어도 true, 즉 1 값을 리턴한다는 것은 아니라는 것을 확인할 수 있습니다. 저도 정확히 왜 컴파일러마다 결과가 다른지, 왜 하필 8 이나 8192 를 리턴하는건지는 잘 모르겠지만 ㅠ ㅜ isspace 에 공백문자를 넘겼을 경우 1 을 리턴하는 것이 아닌, 그냥 0 이 아닌 정수를 리턴한다라고만 이해해주시면 될 것 같습니다.

if 의 조건문이 참이라는 것은 if의 조건문의 결과가 false, 즉 0이 아닐 때를 의미합니다. if의 조건문은 결과가  0 이 아니기만 하면 모두 참입니다. 따라서 if (isspace(c)) 조건문의 결과는 참이 될 수 있습니다. c가 공백문자라면 isspace(c)가 8을 리턴하건 8192를 리턴하건 일단 0 은 아니기 때문에 참이 될 수 있거든요! if(8192)는 참인 조건입니다. 그러나 if (isspace(c) == true) 는 곧 if (8192 == 1) 이냐는 것을 묻는 것이나 다름 없습니다. 즉 isspace(c)가 1이냐를 묻는 것이에요! 이건 거짓인 조건이죠. 위에서 알 수 있다시피 isspace(c)는 공백문자를 넘기면 1을 리턴하는 것이 아닌 그저 0 이 아닌 8이나 8192 같은 정수를 리턴하는 것을 확인할 수 있었죠. 그래서 질문자님이 if (isspace(c) == true) 로 하셨을 때 이 부분의 word_flag=false; 가 실행이 안됐던 것입니다. 한번도 조건문이 참이  된적이 없었기 때문입니다! 

참고 답변 사진

출처 https://stackoverflow.com/questions/46103222/issues-with-isspace-and-replace

0

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

2020. 12. 16. 21:27

정말 쉽게 이해됬어요!! 감사합니다!!

sjjeon17님의 프로필 이미지

작성한 질문수

질문하기