OT: Trying to learn C -- some questions

Matt Emmerton matt at gsicomp.on.ca
Thu Nov 25 19:03:49 PST 2004


> On Thu, 25 Nov 2004, Tom Parquette wrote:
> > I'm trying to learn ANSI C using a book circa 1994.  It is written from
> > a DOS perspective. Someone at work, who knows a little C, told me that
> > the book was "close enough".
>
> I think they are probably wrong.
>
> > 1) gcc complains that <conio.h> was not found.  If I comment out the
> > #include, the program compiles.  Is this a DOSism or something else?
>
> I don't know if it's a DOSism, but it's definitely not a standard header
> file in the UNIX world.  I've never encountered it outside of Microsoft
> systems.

This is definitely a DOSism.  On UNIX, most of the functionality in conio.h
can be found in stdio.h or curses.h.

> > 2) fprintf is described with stdprn being valid for a default printer.
This
> > does not seem to be valid in, at least, the FreeBSD world.  man fprintf
did
> > not really help.  I believe I have to create a stream for the print but
I'm
> > not clear on how to do it.
>
> Sorry, not sure about this, but again, it sounds like a DOS (or MS)
> specific implementation.

stdprn is definitely another DOSism.

If you want to print directly to a printer, you have a bunch of choices:
1) write the output to a temporary file, and then use lpr to print the file
to a printer (defined in /etc/printcap)
2) open a stream to /dev/lpt0 and fprintf directly to it -- this assumes
that your printer is attached to parallel port 1.

> > 3) gets() is used in a number of places.  Using this gets me:
> > /var/tmp//cciWrf9n.o(.text+0x20d): In function `get_data':
> > : warning: warning: this program uses gets(), which is unsafe.
>
> 'gets()' will still work, but its use isn't advised.  If you're just using
> it in test programs, though, it's not a big deal.

Regardless, you should convert your code to use fgets(), as it prevents
against buffer overflow problems.

> > 4) A couple of the home work assignments use getch().  I figured out
from the
> > getch man page that I needed "#include <curses.h>" but that changes the
> > errors to:
> > /var/tmp//cc1GEzyG.o(.text+0x6a): In function `main':
> > : undefined reference to `stdscr'
> > /var/tmp//cc1GEzyG.o(.text+0x6f): In function `main':
> > : undefined reference to `wgetch'
> > I do not know what header file I should be including.
> > Or is there something else I'm not understanding?
>
> I think the real problem hear is that the getch() the example is
> referencing is actually a function found in conio.h.  The getch() in
> curses probably isn't the one you want anyway.
> (Ref.: http://lists.apple.com/archives/mpw-dev/2001/Aug/msg00182.html)

The <curses.h> version of getch() should work fine, although you could use
fgets() from stdin instead.

--
Matt Emmerton



More information about the freebsd-questions mailing list