putc needs stdout, vs puts

微笑、不失礼 提交于 2019-12-12 12:07:12

问题


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.


回答1:


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




回答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.




回答3:


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.




回答4:


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



来源:https://stackoverflow.com/questions/4563825/putc-needs-stdout-vs-puts

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!