What is the difference between printf() and puts() in C?
I know you can print with printf()
and puts()
. I can also see that pr开发者_JS百科intf()
allows you to interpolate variables and do formatting.
Is puts()
merely a primitive version of printf()
. Should it be used for every possible printf()
without string interpolation?
puts
is simpler than printf
but be aware that the former automatically appends a newline. If that's not what you want, you can fputs
your string to stdout or use printf
.
(This is pointed out in a comment by Zan Lynx, but I think it deserves an answer - given that the accepted answer doesn't mention it).
The essential difference between puts(mystr);
and printf(mystr);
is that in the latter the argument is interpreted as a formatting string. The result will be often the same (except for the added newline) if the string doesn't contain any control characters (%
) but if you cannot rely on that (if mystr
is a variable instead of a literal), you should not use it.
So, it's generally dangerous - and conceptually wrong - to pass a dynamic string as single argument of printf
:
char * myMessage;
// ... myMessage gets assigned at runtime, unpredictable content
printf(myMessage); // <--- WRONG! (what if myMessage contains a '%' char?)
puts(myMessage); // ok
printf("%s\n",myMessage); // ok, equivalent to the previous, perhaps less efficient
The same applies to fputs
vs fprintf
(but fputs
doesn't add the newline).
Besides formatting, puts
returns a nonnegative integer if successful or EOF
if unsuccessful; while printf
returns the number of characters printed (not including the trailing null).
In simple cases, the compiler converts calls to printf()
to calls to puts()
.
For example, the following code will be compiled to the assembly code I show next.
#include <stdio.h>
main() {
printf("Hello world!");
return 0;
}
push rbp
mov rbp,rsp
mov edi,str.Helloworld!
call dword imp.puts
mov eax,0x0
pop rbp
ret
In this example, I used GCC version 4.7.2 and compiled the source with gcc -o hello hello.c
.
In my experience, printf()
hauls in more code than puts()
regardless of the format string.
If I don't need the formatting, I don't use printf
. However, fwrite
to stdout
works a lot faster than puts
.
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
Note: per comments, '\0' is an integer constant. The correct expression should be sizeof(char)
as indicated by the comments.
int puts(const char *s);
puts() writes the string s and a trailing newline to stdout.
int printf(const char *format, ...);
The function printf() writes output to stdout, under the control of a format string that specifies how subsequent arguments are converted for output.
I'll use this opportunity to ask you to read the documentation.
Right, printf
could be thought of as a more powerful version of puts
. printf
provides the ability to format variables for output using format specifiers such as %s
, %d
, %lf
, etc...
the printf() function is used to print both strings and variables to the screen while the puts() function only permits you to print a string only to your screen.
puts
is the simple choice and adds a new line in the end and printf
writes the output from a formatted string.
See the documentation for puts
and for printf
.
I would recommend to use only printf
as this is more consistent than switching method, i.e if you are debbugging it is less painfull to search all printfs than puts
and printf
. Most times you want to output a variable in your printouts as well, so puts
is mostly used in example code.
When comparing puts()
and printf()
, even though their memory consumption is almost the same, puts()
takes more time compared to printf()
.
精彩评论