在 C 语言中,输入和输出(I/O)是非常基本的操作,通常用于与用户交互、读取文件或向文件写入数据等。C 语言标准库提供了几个函数来进行 I/O 操作,其中最常用的是 printf
和 scanf
函数。
标准输入输出
1. 标准输出:printf
printf
函数用于格式化输出字符串。它的原型通常如下:
int printf(const char *format, ...);
format
参数是一个字符串,用来指定输出格式。- 后续参数是可变参数列表,对应
format
字符串中的占位符。
示例:
#include <stdio.h>
int main() {
int age = 25;
printf("Hello, my age is %d\n", age); // 输出:Hello, my age is 25
return 0;
}
2. 标准输入:scanf
scanf
函数用于从标准输入(通常是键盘)读取格式化的数据。它的原型通常如下:
int scanf(const char *format, ...);
format
参数是一个字符串,用来指定输入格式。- 后续参数是可变参数列表,对应
format
字符串中的占位符,用来接收输入的数据。
示例:
#include <stdio.h>
int main() {
int age;
printf("Please enter your age: ");
scanf("%d", &age); // 读取用户输入的整数
printf("Your age is: %d\n", age);
return 0;
}
注意事项
-
类型匹配:
- 确保
printf
和scanf
中的格式说明符与变量类型相匹配。 - 例如,使用
%d
来读写整数,使用%f
来读写浮点数,使用%s
来读写字符串。
- 确保
-
地址符号:
- 当使用
scanf
时,必须使用地址符号&
来传递变量的地址,因为scanf
需要直接修改变量的值。 - 对于
printf
,不需要地址符号,因为它只是输出变量的值。
- 当使用
-
空格和换行:
scanf
会忽略开头的空白字符(包括空格和换行),直到遇到第一个非空白字符。- 使用
scanf
读取字符串时,%s
默认只读取第一个单词(直到遇到空格)。如果要读取整个行,可以使用fgets
函数。
-
格式化字符串攻击:
- 使用
printf
和scanf
时要注意格式化字符串攻击的风险。避免使用未验证的用户输入作为格式化字符串的一部分。 - 例如,不要使用
%s
读取未知长度的字符串,因为这可能导致缓冲区溢出。
- 使用
更多 I/O 函数
除了 printf
和 scanf
之外,C 语言还提供了其他一些常用的 I/O 函数,如 fprintf
和 fscanf
用于文件 I/O,fgets
用于读取一行文本,fputs
用于输出一行文本等。
示例:使用 fgets
和 fputs
#include <stdio.h>
int main() {
char line[100];
printf("Enter some text: ");
fgets(line, sizeof(line), stdin); // 读取一行文本
fputs(line, stdout); // 输出读取的文本
return 0;
}