quf9484   2년 전

9번째줄에 len이 원래 길이보다 +1 돼서 나오는데 fgets로 받아서 그런건가요?

아니면 strlen이 원래 그런건가요??

djm03178   2년 전

http://en.cppreference.com/w/c...

"Parsing stops if end-of-file occurs or a newline character is found, in which case str will contain that newline character."

djm03178   2년 전

물론 strlen은 널 문자가 나타나기 전까진 어떤 종류의 문자든 가리지 않고 카운트합니다.

quf9484   2년 전

그러면 fgets는 마지막 엔터까지 입력으로 받아서 길이가 +1되는거에요?

djm03178   2년 전

재채점 전에는 eoln이 없는 케이스가 있어서 개행 문자가 안 들어가있는 경우가 있었지만, 지금은 fgets를 쓰면 항상 마지막에 개행문자가 포함된다고 보시면 됩니다.

그런데, 그 전에 지금은 arr의 크기가 충분치 못해서 99만 9999글자까지밖에 입력받을 수가 없기에 문제가 생길 수 있습니다.

quf9484   2년 전

먼저 원래 질문에대한 답변이 된 것 같아서 감사합니다.


그런데 추가적인 질문으로 배열크기를 1,000,000로 잡으면 100만개의 글자를 입력받을 수 있는거 아닙니까??

배열크기를 1로 받으면 하나를 입력받을 수 있는 것 처럼


배열의 마지막에 '\0'가 들어가야 되는 것 때문에 그런 것 같은데 메모리가 따로 잡히지 않나요??

djm03178   2년 전

컴퓨터가 사용자를 위해 널 문자용으로 1바이트를 따로 잡아줄 이유는 전혀 없습니다. 애초에 '문자열'의 정의는 연속된 공간에 char형이 연속으로 존재하고 널 문자로 끝나는 형태일 뿐이지, 널 문자를 특별취급해서 전혀 다른 메모리에 보관한다거나 하지 않습니다.

마찬가지로 크기가 1인 char형 배열에는 빈 문자열 외에는 문자열을 담을 수 없습니다. 이는 %c로 문자 한 개를 입력받는 거랑은 다릅니다. %c나 getchar를 이용해서 받는 것은 "문자열"이 아니라 하나의 "문자"로, 한 글자만을 저장하는 것이기 때문에 끝을 표기하는 별도의 장치가 없습니다.

참고로, fgets에 대한 레퍼런스를 찾아보면 처음부터 fgets는 널 문자를 위해 최대 주어진 길이 -1개의 문자까지만을 저장합니다. 여기에 개행 문자까지 받아들이려면, 1000002바이트는 필요하다는 뜻입니다.

quf9484   2년 전

완벽한 설명 감사합니다.
좋은 하루 되세요 :)

댓글을 작성하려면 로그인해야 합니다.