In C programming, scanf
is a standard library function used to read formatted input from the standard input stream (usually the keyboard). It is defined in the <stdio.h>
header file and is widely used for reading different types of data.
Syntax
int scanf(const char *format, ...);
- format: A string that specifies how to interpret the input. It can consist of format specifiers (e.g.,
%d
,%f
,%s
, etc.) that denote the type of data expected. - ...: A variable number of arguments, which are pointers to variables where the input will be stored.
Return Value
scanf
returns the number of input items successfully matched and assigned. This can be useful for error checking, as it allows the programmer to verify whether the expected number of items was read. If an error occurs or the end of the input is reached before any items are matched, a value less than the number of input items requested is returned. If no items are matched, it returns EOF (usually -1).
Common Format Specifiers
%d
: Reads an integer.%f
: Reads a float.%lf
: Reads a double.%c
: Reads a single character.%s
: Reads a string (stops reading at whitespace).%ld
: Reads a long integer.%u
: Reads an unsigned integer.
Example
Here’s a simple example that demonstrates how to use scanf
to read various types of input:
#include <stdio.h>
int main() {
int age;
float height;
char name[50];
printf("Enter your age: ");
scanf("%d", &age); // Read an integer
printf("Enter your height in meters: ");
scanf("%f", &height); // Read a float
printf("Enter your name: ");
scanf("%s", name); // Read a string (up to whitespace)
printf("You are %d years old, %.2f meters tall, and your name is %s.\n", age, height, name);
return 0;
}
Important Notes
-
Buffer Overflow: When using
%s
to read strings, it's important to be aware of buffer overflow vulnerabilities. Always ensure that the buffer is large enough to hold the input string and use limiting width specifiers (e.g.,%49s
for a 50-character buffer to prevent overflow). -
Whitespace: By default,
scanf
ignores leading whitespace when reading input. However, for the%c
specifier, leading whitespace is not ignored. -
Error Handling: Always check the return value of
scanf
to handle input errors gracefully. -
Variable Argument Lists: Since
scanf
uses variable arguments, you should be cautious and ensure that the types of the variables match the specified format to avoid undefined behavior. -
Line Ending:
scanf
does not handle newlines in the input stream unless explicitly managed. -
fflush: Using
fflush(stdin)
to clear the input buffer is undefined behavior in C. Instead, to clearstdin
, you will need to handle it differently (e.g., reading leftover characters until a newline).
While scanf
is a powerful tool for input, it’s often recommended to use safer alternatives like fgets
for strings, combined with sscanf
, to avoid buffer overflows and to handle input parsing more robustly.