심심풀이로 만드는 만년달력의 버그

cppig1995의 이미지

심심풀이삼아 만년달력을 만들고 있습니다.
ANSI C표준을 따르고 gcc에서 개발중입니다.

그런데 얼마전 까지는 요일표시가 제대로 안되더니
그것을 고치고 난 다음에는 (이 엄청난 버그는 출력문자열에
탭 2번 넣어서 해결했습니다.) 월표시가 제대로 안되더니
이제 모든 건 해결되고 남은건

"왜 모든 달력이 2번씩 출력될까요?"

처음것은 1번 출력되는데...
calendar.c를 실행시켜보시면 아실것이구요.

[매뉴얼]
7, - : 연감소
9, + : 연증가
3, ] : 월증가
1, [ : 월감소
표준 getchar로 구현하였으므로 RET키 필수랍니다.

File attachments: 
첨부파일 크기
파일 calendar.c1.73 KB
doldori의 이미지

getchar()로 명령을 입력한 후에도 입력 버퍼에는 '\n'이 남아 있어서 그렇습니다.

int c;  // int, not char
c = getchar();

/* process command */

while ((c = getchar()) != '\n' && c != EOF)
    ;

c가 char가 아니라 int인 이유에 대해서는 C FAQs Q12.1을 참고하세요.
freesky의 이미지

c = getchar

아래 줄에

fflush(stdin); 을 추가해주세요.

입력 버퍼의 내용을 비워주는 역할을 합니다.

올해에는 꼭 노트북이 생기게 해 주세요.

cppig1995의 이미지

입력스트림을 플러쉬하는건 말도 안되는것 아닌가요?
어쨌든 더미 getchar를 넣음으로서 해결했습니다.
두분 모두 감사합니다. :8

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

doldori의 이미지

freesky wrote:
c = getchar

아래 줄에

fflush(stdin); 을 추가해주세요.

입력 버퍼의 내용을 비워주는 역할을 합니다.


이 방법은 특정 구현체에서만 작동할 뿐 이식성이 없습니다.
C FAQs Q12.26을 참고하세요.
freesky의 이미지

음.. 그렇군요..

제가 공부한 책에서 두 가지 방법을 알려주던데

한 가지는 배열을 하나 만들어 문자를 한 번 더 읽어들이는 방법과

다른 하나는 플러쉬 방법이었습니다.

코드가 깔끔해서 그 방법을 말씀드렸는데 오히려 좋지 않은 방법이군요.

어쨌든 좋은 것 하나를 배웠습니다. :wink:

올해에는 꼭 노트북이 생기게 해 주세요.

dondek의 이미지

fgetc()로 다 받아들이는 것이 가장 좋은건가요? 아니면 scanf()에서 정규식을 사용해서 받아들이는 것이 좋은 건가요?

진리를 나의 수준으로 끌어내리지 마라.
나를 진리의 수준으로 끌어올려라. - 배꼽 중에서

정태영의 이미지

dondek wrote:
fgetc()로 다 받아들이는 것이 가장 좋은건가요? 아니면 scanf()에서 정규식을 사용해서 받아들이는 것이 좋은 건가요?

뭐 사용하는 사람 취향 문제겠지만 위에서와 같은 문제를 발생하지 않도록 하려면 그냥 scanf 에서 정규식의 맨 앞에 스페이스를 넣어 버퍼에 남아있을 수 있는 '\n' 등을 무시하도록 하는 게 더 편하지 않을까 싶습니다 (" %c" 처럼 앞에 스페이스가 들어가면 character 앞 쪽에 위치한 화이트 스페이스를 모두 무시합니다)

아니면 fgets 같은 걸로 아예 라인을 읽어들이고 sscanf 등을 이용하는 것이라던가 ncurses 에 있는 getch 를 사용하는 방법도 있겠죠

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.