在C语言中,往往需要输入/输出一些数据,这些数据可能包含文件、命令等。C语言中的I/O(输入输出)通常使用scanf()和printf()两个函数进行输入和输出。
1.标准输入输出函数:scanf()和printf()
标准输入输出函数需要在在 "stdio.h" 头文件中声明。
(1)scanf()函数
scanf()函数用于从标准输入设备(通常是键盘)读取格式化的输入。其基本语法为:
cpp
int scanf(const char *format, ...);
其中,format是格式字符串,指定输入数据的类型。...:可变参数列表,根据格式化字符串中的格式说明符,提供存储输入数据的变量地址。例如:
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num;
float fa;
scanf("%d %f", &num, &fa); // 读取整数和浮点数
}
注意:变量前需加&符号(指针变量除外)。若使用visual studio软件,需在代码的第一行定义"#define _CRT_SECURE_NO_WARNINGS",否则得用scanf_s。
cpp
//输入
5 3.14
(2)printf()函数
printf()函数用于将格式化的数据输出到标准输出设备上。其基本语法为:
cpp
int printf(const char *format, ...);
cpp
int num;
float fa;
scanf("%d %f", &num,&fa); // 读取整数和浮点数
printf("num = %d, fa = %f\n", num, fa);
printf("Hello, World!\n"); // 输出字符串
printf("Number: %d\n", 42); // 输出整数
结果:
常用的格式说明符:
%d:整数%f:浮点数%c:字符%s:字符串
格式化输入输出的高级用法
printf()和scanf()支持宽度、精度等格式化选项:
cpp
printf("%5d\n", 42); // 输出宽度为5的整数
printf("%.2f\n", 3.14159); // 输出两位小数的浮点数
使用scanf()时注意缓冲区溢出,建议指定输入长度:
scanf("%9s", str); // 最多读取9个字符
2.字符输入输出:getchar()和putchar()
getchar()和putchar()用于单个字符的输入输出。
cpp
int getchar(void); // 从屏幕读取一个字符
int putchar(int c); // 把字符输出到屏幕上
示例:
cpp
char c = getchar(); // 读取字符
putchar(c); // 输出字符
结果:
cpp
abc
a
3.字符串输入输出:gets()和puts()
gets()和puts()用于字符串的输入输出,但gets()不安全,容易导致缓冲区溢出,推荐使用fgets()。其基本语法为:
cpp
char *fgets(char *str,int n,FILE *stream); // 读取字符串
int puts(const char *str); // 输出字符串
其中,参数:
-
str:指向字符数组的指针,用于存储读取的字符串。 -
n:要读取的最大字符数(包括空字符\0)。 -
stream:文件流,通常使用stdin表示标准输入。
cpp
char str[100];
fgets(str, sizeof(str), stdin); // 安全读取字符串
puts(str); // 输出字符串

fputs()函数
fputs() 函数用于将字符串输出到指定的流(如标准输出、文件等),但不会自动在字符串末尾添加换行符。
语法:
cpp
int fputs(const char *str, FILE *stream);
参数:
-
str:要输出的字符串(以空字符\0结尾的字符数组)。 -
stream:指定输出的流,可以是标准输出(stdout)、文件流等。
返回值:
-
成功时返回一个非负值(通常是输出的字符数)。
-
失败时返回
EOF。
cpp
char str[100];
fgets(str, sizeof(str), stdin); // 安全读取字符串
fputs(str,stdout); // 输出字符串但不换行
puts()和fputs()的区别:
| 特性 | puts() |
fputs() |
|---|---|---|
| 换行符 | 自动在字符串末尾添加换行符 | 不添加换行符 |
| 输出流 | 只能输出到标准输出(屏幕) | 可以输出到任意流(如文件、屏幕) |
| 参数 | 只需要一个字符串参数 | 需要字符串参数和流参数 |
4.文件输入和输出:fscanf()和fprintf()
文件操作使用fprintf()和fscanf(),与printf()和scanf()类似,但需指定文件指针。
cpp
#include <stdio.h>
int main()
{
FILE *fp;
char str[100];
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("error opening file.\n");
return 1;
}
while (fgets(str, sizeof(str), fp) != NULL) {
printf("%s", str);
}
fclose(fp);
return 0;
}

cpp
#include <stdio.h>
int main()
{
FILE* file;
file = fopen("test1.txt", "w"); // 打开文件进行写入,如果文件不存在则创建,如果存在则覆盖
if (file != NULL)
{
fprintf(file, "Hello,File!\nhhhhh"); // 写入文件
fclose(file);
}
file = fopen("test1.txt", "r");
char buffer[200];
if (file != NULL)
{
fscanf(file, "%s", buffer); // 读取文件,但是在遇到第一个空格和换行符时,它会停止读取。
printf("Read from file: %s\n", buffer);
fclose(file);
}
return 0;
}
结果:
cpp
Read from file: Hello,File!