strlen(buf) -> 이부분은 null을 제외한 문자의 길이를 가져옵니다.
예를들면 "abc" 가 있다면 strlen의 리턴값은 3입니다.
하지만 배열은 0부터 시작을 하져. 그래서 -1을 해주는 겁니다.
여기서 -1을 한후 0을 하면 "ab\0"이 되겠네여...
문자열을 출력해보면 "ab"가 나올겁니다.
fgets는 실제 파일의 개행문자를 그대로 가져오네요.
파일에 다음 과 같이 들어 있다고 가정하고..
abc(행바꿈 '\n'문자를 가지고 있습니다.)
bcd
_ <---요기가 커서가 갈수 있는 마지막자리.
이경우 첫라인을 fgets로 읽어 와보죠.
fgets(tmp, 256, fp);라고 하면 tmp라는 문자열에는 다음 과 같이 들어가
죠.
+---+---+---+------+----+
| a | b | c | '\n' | \0 |
+---+---+---+------+----+
화면에 한번 찍어보죠.
puts(tmp);
abc
_ <---- 프린트후에 우리가 원한 커서의 위치는 여기
_ <---- 커서의 위치가 여기로 오죠. 원했던 결과와 달라 지네요.
그래서.. strlen(tmp)의 값을 조사해보면 기대(3)와 다르게 4가 나오죠.
우리가 모르는 사이에 개행문자가 tmp문자열에 들어 가있는 상태입니다.
이걸 제거하기 위해
tmp[strlen(tmp) -1] = '\0'을 합니다.
머 다알겠지만 \0의 아스키 코드가 0이라 아스키 코드로 직접 입력할 수
도 있습니다.
Re: 이것을 왜 하는지요?
음... fgets 함수는 마지막에 개행문자를 삽입하는데,
그것을 지우려고 한 모양입니다 -.-
Re^2: 이것을 왜 하는지요?
마지막에 개행문자라면
\n <--- 이걸 말씀하시는지요?
Re: 이것을 왜 하는지요?
while(fgets(buf, 256, stdin) != NULL){
buf[strlen(buf) - 1] = 0;
}
strlen(buf) -> 이부분은 null을 제외한 문자의 길이를 가져옵니다.
예를들면 "abc" 가 있다면 strlen의 리턴값은 3입니다.
하지만 배열은 0부터 시작을 하져. 그래서 -1을 해주는 겁니다.
여기서 -1을 한후 0을 하면 "ab\0"이 되겠네여...
문자열을 출력해보면 "ab"가 나올겁니다.
아는 사람들은 쉬어서 답을 안다시나... 막둥님만 맞고 다른분은
fgets는 실제 파일의 개행문자를 그대로 가져오네요.
파일에 다음 과 같이 들어 있다고 가정하고..
abc(행바꿈 '\n'문자를 가지고 있습니다.)
bcd
_ <---요기가 커서가 갈수 있는 마지막자리.
이경우 첫라인을 fgets로 읽어 와보죠.
fgets(tmp, 256, fp);라고 하면 tmp라는 문자열에는 다음 과 같이 들어가
죠.
+---+---+---+------+----+
| a | b | c | '\n' | \0 |
+---+---+---+------+----+
화면에 한번 찍어보죠.
puts(tmp);
abc
_ <---- 프린트후에 우리가 원한 커서의 위치는 여기
_ <---- 커서의 위치가 여기로 오죠. 원했던 결과와 달라 지네요.
그래서.. strlen(tmp)의 값을 조사해보면 기대(3)와 다르게 4가 나오죠.
우리가 모르는 사이에 개행문자가 tmp문자열에 들어 가있는 상태입니다.
이걸 제거하기 위해
tmp[strlen(tmp) -1] = '\0'을 합니다.
머 다알겠지만 \0의 아스키 코드가 0이라 아스키 코드로 직접 입력할 수
도 있습니다.
gets와 fgets의 차이때문에 생기는 현상입니다.
참고하세요.
Re: 이것을 왜 하는지요?
음.. 먼가 좀이상하긴하네요..
-1을 해주는 자체는 별 이상한게 아닌데..
( 배열이 원래 0 부터 시작하니까요.. )
strlen 으로 스트링의 길이를 구한다는것은 이미 buf 의 문자 끝에 0 이
붙어 있다는 뜻인데 다시 넣을필요가........ 있었네요..ㅡ,.ㅡ;;;
착각바리..-1해주면 마지막문자 제거됩니다.
댓글 달기