작성
·
372
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
- 위 출력 결과로 알 수 있다시피 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