311, Introduction to Systems Programming
This is enough to get you through the Introduction
notes. We won't do
anything complicated here.
- See CP:AMA, p. 778 (Appendix D, Standard Library Functions),
points you to Sec. 3.1 and Sec. 22.3. Simple uses of
are shown in Ch. 2, which is about the same level as these notes.
- CS:APP, Sec. 2.1 has some more examples, especially at the byte
- CP:AMA Sec. 22.3, C:ARM Sec.
15.11 and APUE Sec. 5.11 have all the details and explanations.
- Of course, the man page for
printf() also has
complete details, but little explanation. It's more useful as a
reminder than as a learning tool.
printf() does formatted output. The first argument
printf() is a format control string (also, format
string, control string, or format specification), and the remaining
arguments are values to be
printed, or pointers to values to be printed. Characters in the
format string, and converted values from the remaining arguments, are
sent to the standard output stream
Character constants in C are written as
'a', and string
constants (string literals, officially) as "a". Strings in C are
arrays of characters, with the special property that there is a null
'\0', numerical value 0) marking the end of the
string. If you didn't know or remember that, read CP:AMA Sec.
13.1, or C:ARM Sec. 2.7.4.
When the character
\ is encountered in the format string,
that starts an
escape character sequence; see CP:AMA p. 41-42 and p. 137-138, or C:ARM
Sec. 2.7.5-6, for details.
This works for strings and characters in general, and is not
printf(). The most common uses are
(newline, to go to the next line on the output device),
(to put a double quote in a string literal without ending the string),
\\ (to put a single backslash in a string literal).
When the character
% is encountered in the format string,
that starts a format
code (a conversion specification) that tells what to do with the next
printf(). This much is specific to
scanf(), which is used for formatted input.
The two simplest format codes are
%d, which means print
an integer value in decimal (the next argument should be an
%s, which means print a character string by copying
the characters from an array (the next argument should be a
*, and it should be aimed at a null-terminated character
string). Use the format code
%% to print one
fprintf() allows you to select an output stream different
stdout. Otherwise it works the same way.
stdout is opened automatically when your program starts to
run, but other output streams need to be opened explicitly as part of
It's relatively easy to get
printf() to fail or behave
strangely if you don't
match the format codes and the argument types properly. Most
compilers, and the
lint program on Solaris, can report
such a problem, if you turn up the warning options.
Here are some examples. We used the symbol
the next character to be printed will appear, but of course
actually appear on the screen except as the cursor position (probably a
blinking black rectangle).
printf("hello world\n"); // \n is
the newline character
char buffer = "it's me";
printf("hello world %s\n", buffer);
hello world it's me
printf("the value is %d\n", 17);
the value is 17
int a = 1, b = 2;
printf("the sum of %d and %d is %d\n", a, b, a+b);
the sum of 1 and 2 is 3
Note the important difference between the first two examples - omitting
\n from the end of the format string means that the next
character to be output will be on the same line, not on the next line.
1. Explain the difference between C's
cout << endl;
2. Since C++ includes the C Standard Library, you can call
from a C++ program. What happens if you use both
cout << in the same program?
3. Suppose you want to write formatted output into a character
instead of sending it to an output stream (which is what
fprintf() do). What function should you use
instead? What problems might you encounter using this function?
You can find a table of format codes for additional types in CP:AMA,
on the man page.
Last revised, 9 Jan. 2012