6

C history question here. Why does the C function putc require a second parameter like

putc( 'c', stdout ) ;

While puts is oh so more convenient

puts( "a string" ) ;

There is a function in msvc++

putchar( 'c' ) ;

Which works the way one might expect putc to work. I thought the second parameter of putc was to be able to direct putc to a file, but there is a function fputc for that.

bobobobo
  • 64,917
  • 62
  • 258
  • 363

4 Answers4

11
int putc ( int character, FILE * stream );

Writes a character to the stream and advances the position indicator.
So it is a more generic function than putchar
Other functions can be based on this e.g.

#define putchar(c) putc((c),stdout)  

According to Kernighan's book putc is equivalent with fputc but putc could be implemented as a macro and putc may have to evaluate its stream argument more than once.
I have read that supposedly that both exist for backward compatibility, but not sure if this is valid

Cratylus
  • 52,998
  • 69
  • 209
  • 339
2

It is so you have the option to output to a different stream such as a file.

fputc and putc are defined largely the same, except that putc may be a macro which evaluates the stream paramter more than once. fputc only evaluates the stream parameter once.

nmichaels
  • 49,466
  • 12
  • 107
  • 135
Evan Teran
  • 87,561
  • 32
  • 179
  • 238
1

The difference between putc and fputc is that by using putc, you risk running the macro version which is inherently unsafe because it may have to evaluate its stream argument more than once. This causes complications that most people aren't aware of and thus do not watch out for, so fputc is better to use. fputc's macro does not have this problem.

Vikram.exe
  • 4,565
  • 3
  • 29
  • 40
1

putchar() isn't just in MSVC - it's a standard C function (well, macro really).

caf
  • 233,326
  • 40
  • 323
  • 462