inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

7.8 단어세기 예제

137

작성자 없음

작성한 질문수 0

0

7.8 단어세기 예제에서

if (!isspace(c))

n_chars++;

이렇게  n_chars++; 을 해주면 단어 수가 세어지는 이유가 무엇인지 잘 모르겠습니다... 원리를 잘 모르겠어요 ㅠㅠ

그리고 line_flag = false; 와 line_flage = true; 의 의미를 잘 모르겠는데 

구체적인 설명과 정의 및 활용 방법을 설명해주시면 감사하겠습니다! 

c

답변 1

0

안소

안녕하세요 :)

n_chars 는 단어수가 아니라 전체 문자 수입니다. 단어 수의 원리에 대해 질문 주신 것인지 n_chars 의 원리에 대해 질문 주신 것인지 모르겠어서 일단 두 경우 다 설명 드리겠습니다. 그리고 isspace(c) 는 파라미터로 넘긴 c 문자가 공백 혹은 줄바꿈 문자같은 whitespace 라면 true 를 리턴한다는 사실을 먼저 전제로 알고 계셔야 합니다. 강의에서 나온 전체 코드를 함께 보시면서 밑에 글을 읽어주세요.

예를 들어 "Hello  World" 이건 단어가 2 개죠. 단어가 2개라고 판단하는 이유는 중간에 '공백'으로 구분이 되어 있기 때문입니다. 

마찬가지로

"Hello"

"World"

이렇게 두 줄이 있다면 이것도 단어가 2 개라고 판단할 수 있죠. 중간에 '줄바꿈'으로 구분이 되어 있으니까요. 

그러니 공백이나 줄바꿈 문자가 등장할 때마다 단어수를 카운팅해주면 되겠다고 생각할 수 있습니다.

근데 주의사항은.. 예를 들어 "Hello             World" 이런 문장이 있다면, 공백이 엄청 여러개죠. 단어 수는 2개인데 공백이 여러개니 공백이 등장할 때마다 단어수를 카운팅해준다면 단어수가 여러개라는 잘못된 결론이 도출될  것입니다. 그렇기 때문에 "처음으로" 공백이 아닌 문자가 등장했을 때먼 새 단어가 등장했구나 하고 단어 수가 새롭게 카운팅 될 수 있어야 합니다. 그래서 word_flag 가 사용되는 것입니다.새 단어가 등장했구나, 즉 "여태 공백 혹은 줄바꿈 문자이다가 처음으로 알파벳 문자" 가 등장했구나, 라는 것을 알기 위해선 우선 공백 혹은 줄바꿈 문자가 등장하면 word_flag 를 true 로 바꾸면 됩니다. 그러면 처음으로 !isspace(c) 즉 공백이 아닌 문자가 처음으로 등장하였는데 word_flag 가 true 인 상태면 이게 바로 여태까지 쭉 공백 혹은 줄바꿈 문자였는데 처음으로 알파벳 문자가 등장했다는 소리이니, 이건 새 '단어' 의 시작이라는 의미니까 단어 수를 카운팅할 수 있겠죠.

if (isspace(c)) word_flag = false; 👉 공백 혹은 줄바꿈 문자가 등장하면 지금은 단어가 아닌 상태이므로 word_flag 를 false 로 둡니다. 예를들면 "Hello             World" 이 문장에서 중간에 공백들은 여기에 걸리겠네요.

if (!isspace(c) && !word_flag) {n_ words++; word_flag = true; } 👉 공백이 아닌 문자인데 word_flag 가 false 이다. 이것은 여태까지 공백이였는데 처음으로 공백이 아닌 알파벳 문자가 등장했다는 소리이므로 위에서 설명드린것과 같이 새로운 단어가 나타났다는 의미가 됩니다. 그러니 단어수 n_words 를 카운팅 해줍니다. 예를들면 "Hello             World" 이 문장에서 단어의 첫번째 문자인 'H' 와 'W'가  여기에 걸리겠네요.

단어 수 설명은 여기까지입니다.

if (!isspace(c)) n_chars++; 👉 이건 전체 문자수를 세는 것입니다. 그냥 단순하게 공백이나 줄바꿈 문자가 아니면 다 그냥 문자수이죠! 예를들어 "Hello World" 이런 문장이 있다면 전체 문자수는 10입니다. 공백이나 줄바꿈은 문자수로 치지 않을 것이기 때문에 공백이나 줄바꿈이 아닐 때만 문자수를 세는 것이구요.

line_flag 도 제가 위에서 설명 드린 word_flag 와 똑같이 이해하시면 됩니다. '몇 줄이냐' 를 판별할 때도 처음으로 줄바꿈이 아닌 문자가 등장했을 때 n_lines 줄을 카운팅 하면 되겠죠!

He

/n

/n

/n

llo

중간에 몇줄을 띄어 쓴 이런 문장이 있더라도 알파벳 문자가 있는 것만 줄 수로 판단할 것이기 때문에 "2 줄"로 판단할 것입니다. 따라서 이는 n_ words 셀 때 처럼, 줄바꿈 문자가 등장했을 떈 line_flag 를 false 로 해주어 지금 줄바꿈 문자 상태라는 것을 인지해두고, line_flag == false 상태이다가 처음으로 줄바꿈이 아닌 문자가 등장하면 !isspace(c) 이것은 여태 줄바꿈 상태였는데 처음으로 문자가 등장했다는 것이므로 새로운 줄이 등장했다는 의미가 됩니다. 따라서 이럴때만 라인 수 n_lines 를 카운팅하는 것입니다.

질문은 연관 강의에서 질문을 해주셔야 하기 때문에 7.8 강의에 대해 질문 주신 것이니 7.8 강의의 질문탭에서 질문글을 써주셔야 합니다. 그래야 제가 강의를 참고하기도 편하고 7.8강의 듣는 다른분들도 질문자님의 글을 참고할 수 있거든요. 다음부턴 공지대로 연관 강의에서 질문글을 써주시길 부탁드립니다.

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

44

3

main 함수에서 왜 int만 선언이 되는걸까요

1

52

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

52

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

46

1

프로토타입과 함수간의 인자 불일치

1

72

2

12.12 헤더 관련 질문

1

59

2

Visual Studio Community 2026 사용 문의

1

133

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

59

2

getchar(), putchar()

1

92

3

강의자리ㅛ

1

78

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

112

2

소스파일안에 여러 파일

1

74

2

F5와 F7의 차이

1

75

2

c = TWO * (a+b); 에서 a와 b는?

1

58

2

; 세미콜론을 붙이는 기준에 문의

1

68

1

Step over 기능 문의

1

52

2

2.6 강의 따옴표 출력 규칙 문의

1

74

2

int main 함수 관련 오류 문의

1

67

2

13.4 words[0]

0

60

2

11.7 함수를 구현해 봤습니다.

1

62

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

64

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

53

2

11.6 fit_str함수를 구현해 봤습니다.

1

53

2

11.5 코드 구현

1

66

2