이것을 왜 하는지요?

익명 사용자의 이미지


정말 초보인데요. 코딩하는데 아래의 문장이 나오던데 왜 이렇게 해주는지 궁금합니다.

while(fgets(buf, 256, stdin) != NULL){
buf[strlen(buf) - 1] = 0;
}

buf의 첨자에서 왜 -1을 해주는지요?

익명 사용자의 이미지

음... fgets 함수는 마지막에 개행문자를 삽입하는데,

그것을 지우려고 한 모양입니다 -.-

익명 사용자의 이미지

마지막에 개행문자라면

\n <--- 이걸 말씀하시는지요?

익명 사용자의 이미지

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의 차이때문에 생기는 현상입니다.
참고하세요.

익명 사용자의 이미지

음.. 먼가 좀이상하긴하네요..

-1을 해주는 자체는 별 이상한게 아닌데..
( 배열이 원래 0 부터 시작하니까요.. )

strlen 으로 스트링의 길이를 구한다는것은 이미 buf 의 문자 끝에 0 이
붙어 있다는 뜻인데 다시 넣을필요가........ 있었네요..ㅡ,.ㅡ;;;

착각바리..-1해주면 마지막문자 제거됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.