C 语言输入和输出(I/O)
在 C 语言中,输入和输出(I/O)是与用户和程序之间交互的基本方式。C 提供了标准的输入输出库(stdio.h)来进行这些操作。下面是 C 语言输入输出的详细介绍。
1. 标准输入与输出库:stdio.h
C 语言的标准输入输出函数都位于 stdio.h 头文件中。因此,在使用输入输出功能时需要包含这个头文件:
#include <stdio.h>
2. 标准输出:printf()
printf() 函数用于格式化输出数据到标准输出设备(通常是屏幕)。其基本语法为:
int printf(const char *format, ...);
format:格式化字符串,用于控制输出的格式。...:可变参数,根据格式字符串提供具体的数据。
示例:
#include <stdio.h>
int main() {
int age = 25;
printf("Hello, World!\n"); // 输出普通字符串
printf("Age: %d\n", age); // 输出整型数据
printf("Height: %.2f\n", 5.9); // 输出浮点数据,保留两位小数
return 0;
}
输出:
Hello, World!
Age: 25
Height: 5.90
常见格式化输出符号:
%d:输出整数(十进制)%f:输出浮点数%c:输出字符%s:输出字符串%.2f:输出浮点数,保留 2 位小数%x:输出整数的十六进制形式
3. 标准输入:scanf()
scanf() 函数用于从标准输入设备(通常是键盘)读取数据,并将其存储到变量中。其基本语法为:
int scanf(const char *format, ...);
format:格式字符串,指明输入数据的类型和格式。...:变量的地址,用来存储输入的数据。
示例:
#include <stdio.h>
int main() {
int age;
float height;
printf("Enter your age: ");
scanf("%d", &age); // 读取整数
printf("Enter your height: ");
scanf("%f", &height); // 读取浮点数
printf("Age: %d, Height: %.2f\n", age, height);
return 0;
}
输出:
Enter your age: 25
Enter your height: 5.9
Age: 25, Height: 5.90
常见格式化输入符号:
%d:读取整数%f:读取浮点数%c:读取字符%s:读取字符串(会忽略空格)
4. 读取字符串:gets() 和 fgets()
在 C 中,读取字符串的常用函数有 gets() 和 fgets()。然而,gets() 不安全,容易导致缓冲区溢出问题,因此推荐使用 fgets()。
4.1 gets() (不推荐使用)
char str[100];
gets(str); // 读取一行输入,直到遇到换行符或 EOF
gets() 函数会读取整行输入,包括空格,直到遇到换行符。它不检查数组边界,容易导致缓冲区溢出。
4.2 fgets() (推荐使用)
#include <stdio.h>
char str[100];
fgets(str, sizeof(str), stdin); // 安全地读取一行输入
fgets() 更加安全,因为它允许指定最大读取字符数,从而防止缓冲区溢出。
示例:
#include <stdio.h>
int main() {
char name[50];
printf("Enter your name: ");
fgets(name, sizeof(name), stdin); // 使用 fgets 读取字符串
printf("Hello, %s", name);
return 0;
}
输出:
Enter your name: John Doe
Hello, John Doe
5. 输出到文件:fprintf() 和 fputs()
除了标准输出,C 还提供了将数据输出到文件的功能。fprintf() 函数用于向文件输出格式化数据,fputs() 用于输出字符串。
5.1 fprintf()
FILE *f = fopen("output.txt", "w");
fprintf(f, "Hello, File!\n"); // 向文件输出
fclose(f);
5.2 fputs()
FILE *f = fopen("output.txt", "w");
fputs("Hello, File!\n", f); // 向文件输出字符串
fclose(f);
6. 从文件读取:fscanf() 和 fgets()
fscanf() 函数与 scanf() 类似,但用于从文件中读取数据。fgets() 同样也可以用于从文件中读取字符串。
6.1 fscanf()
FILE *f = fopen("input.txt", "r");
int num;
fscanf(f, "%d", &num); // 从文件中读取整数
fclose(f);
6.2 fgets()
FILE *f = fopen("input.txt", "r");
char str[100];
fgets(str, sizeof(str), f); // 从文件中读取一行
fclose(f);
7. 输入输出的错误处理
在使用 scanf()、printf()、fscanf() 等函数时,通常需要检查是否成功执行。例如,scanf() 函数会返回成功读取的项目数量,如果不等于预期的数量,则输入失败。
示例:
#include <stdio.h>
int main() {
int age;
printf("Enter your age: ");
if (scanf("%d", &age) != 1) {
printf("Input error!\n");
} else {
printf("Your age is: %d\n", age);
}
return 0;
}
8. 总结
- 标准输出:使用
printf()函数输出数据。 - 标准输入:使用
scanf()函数获取用户输入。 - 字符串输入输出:使用
gets()或fgets()。 - 文件输入输出:使用
fprintf()、fscanf()、fputs()和fgets()。
通过合理使用这些输入输出函数,可以更有效地与用户交互或处理文件数据。