scanf
和printf
是C语言标准库中用于输入和输出的函数,它们分别定义在stdio.h
头文件中。这两个函数在C++中同样可以使用,因为C++是C的一个超集。
printf函数
printf
函数用于格式化输出,可以将数据输出到标准输出流(通常是屏幕)。它的原型如下:
int printf(const char *format, ...);
format
:一个格式字符串,其中可以包含格式化占位符,如%d
、%f
、%s
等。...
:可变参数列表,可以是任意数量和类型的参数,它们的值将按照format
字符串中指定的格式进行格式化并输出。
示例:
#include <stdio.h>
int main() {
int age = 25;
float salary = 5000.50;
char name[] = "John Doe";
printf("Name: %s\n", name);
printf("Age: %d\n", age);
printf("Salary: %.2f\n", salary);
return 0;
}
在这个示例中,printf
用于输出一个字符串、一个整数和一个浮点数。%s
、%d
和%f
是格式化占位符,分别对应字符串、整数和浮点数。
scanf函数
scanf
函数用于从标准输入流(通常是键盘)读取格式化输入。它的原型如下:
int scanf(const char *format, ...);
format
:一个格式字符串,指定了输入数据的预期格式。...
:可变参数列表,包含了指向变量的指针,这些变量将存储输入的数据。
示例:
#include <stdio.h>
int main() {
int age;
float salary;
char name[50];
printf("Enter name: ");
scanf("%s", name);
printf("Enter age: ");
scanf("%d", &age);
printf("Enter salary: ");
scanf("%f", &salary);
printf("Name: %s\n", name);
printf("Age: %d\n", age);
printf("Salary: %.2f\n", salary);
return 0;
}
在这个示例中,scanf
用于从用户那里读取一个字符串、一个整数和一个浮点数。%s
、%d
和%f
是格式化占位符,分别对应字符串、整数和浮点数。注意,对于非字符串类型的变量,需要提供变量的地址(使用&
运算符)。
注意事项
- 安全性:使用
scanf
时,如果不正确地处理输入,可能会导致缓冲区溢出等安全问题。因此,当读取字符串时,应该总是指定最大长度,例如scanf("%49s", name)
。 - 返回值:
scanf
和printf
都返回成功匹配和赋值的参数数量。如果输入不符合预期格式,scanf
可能会返回0或负值。 - 输入/输出格式:
printf
和scanf
的格式字符串非常灵活,支持多种格式化选项,如宽度、精度、长度修饰符等。 - 可读性:虽然
printf
和scanf
功能强大,但在复杂的输入输出处理中,使用fgets
、puts
、sprintf
等函数可能更安全、更易于理解。
这些函数是C和C++中处理输入输出的基本工具,掌握它们对于编程非常重要。
printf
格式化字符
%d
或%i
:十进制整数。%u
:无符号十进制整数。%x
或%X
:十六进制整数(小写或大写字母)。%o
:八进制整数。%f
:浮点数(小数点形式)。%e
或%E
:科学计数法(小写或大写e
)。%g
或%G
:通用浮点数表示法(根据数值大小自动选择%f
或%e
)。%a
或%A
:十六进制浮点数(C99标准)。%c
:单个字符。%s
:字符串。%p
:指针地址。%n
:存储到目前为止已写入的字符数。%%
:字面上的百分号。
scanf
格式化字符
%d
:十进制整数。%i
:整数(与%d
相同)。%u
:无符号十进制整数。%x
或%X
:十六进制整数。%o
:八进制整数。%f
:浮点数。%lf
:双精度浮点数(double
)。%e
,%E
,%f
,%g
,%G
:与printf
相同,用于浮点数。%c
:单个字符。%s
:字符串。%p
:指针(通常不推荐使用scanf
读取指针)。%n
:读取的字符数(用于int
变量)。%[]
:扫描字符集合(扫描字符串中的字符)。
长度修饰符
h
:短整型(short int
),或无符号短整型(unsigned short int
)。l
:长整型(long int
),或无符号长整型(unsigned long int
);对于double
类型,表示long double
。ll
:长长整型(long long int
),或无符号长长整型(unsigned long long int
)。j
:intmax_t
类型(C99标准)。z
:size_t
类型。t
:ptrdiff_t
类型。L
:long double
类型。
精度修饰符
.
:后面跟数字,指定精度(小数位数)。
示例
%5d
:至少宽度为5的整数。%08x
:宽度为8的十六进制数,不足部分用0填充。%7.2f
:宽度至少为7,小数点后保留2位的浮点数。
这些格式化字符和修饰符可以组合使用,以满足各种输入输出的需求。