printf
函数:输出格式化信息到控制台 printf("格式字符串", 参数列表);
把格式化后的字符串输出到控制台。格式字符串里可以包含普通字符和格式说明符,格式说明符会被后面参数列表里的值替换。
格式说明符一般以 %
开头,常见的有 %d
(用于输出整数)、%f
(用于输出浮点数)、%c
(用于输出字符)、%s
(用于输出字符串)等。
适用于各种基本数据类型以及字符串。
#include
int main() {
int age = 20;
float height = 1.75;
char grade = 'A';
char name[] = "Alice";
// 输出整数
printf("年龄是 %d 岁。\n", age);
// 输出浮点数
printf("身高是 %.2f 米。\n", height);
// 输出字符
printf("成绩等级是 %c。\n", grade);
// 输出字符串
printf("姓名是 %s。\n", name);
return 0;
}
在这个例子中,printf
函数依据格式说明符把变量的值输出到控制台。%.2f
表示输出浮点数时保留两位小数。
scanf
函数:从控制台读取格式化输入 scanf("格式字符串", &变量1, &变量2, ...);
从控制台读取用户输入的数据,并且按照格式字符串的要求把数据存储到对应的变量中。
格式说明符和 printf
函数里的类似,不过要在变量名前加上取地址符 &
,以此表明是要把数据存储到该变量的地址处。
适用于各种基本数据类型。
#include
int main() {
int num;
float score;
char ch;
// 提示用户输入整数
printf("请输入一个整数:");
scanf("%d", &num);
// 提示用户输入浮点数
printf("请输入一个浮点数:");
scanf("%f", &score);
// 提示用户输入字符
printf("请输入一个字符:");
scanf(" %c", &ch); // 注意前面的空格,用于跳过之前输入的换行符
// 输出用户输入的内容
printf("你输入的整数是 %d,浮点数是 %.2f,字符是 %c。\n", num, score, ch);
return 0;
}
这个例子中,scanf
函数按照格式说明符读取用户输入的数据,并把它们存储到对应的变量中。在读取字符前加空格是为了跳过之前输入的换行符。
getchar
函数:读取单个字符 ⌨️int getchar(void);
从标准输入(通常是键盘)读取一个字符,并返回该字符的 ASCII 码值。
调用 getchar
函数时,程序会暂停,等待用户输入一个字符,按下回车键后,函数会返回该字符的 ASCII 码值。
getchar
会读取换行符,所以在连续使用时要注意处理换行符。int
类型,不是 char
类型。适用于字符类型。
#include
int main() {
char ch;
// 提示用户输入一个字符
printf("请输入一个字符:");
ch = getchar();
// 输出用户输入的字符
printf("你输入的字符是 %c。\n", ch);
return 0;
}
此例中,getchar
函数读取用户输入的一个字符,并将其赋值给变量 ch
,然后输出该字符。
putchar
函数:输出单个字符 ️int putchar(int c);
把一个字符输出到标准输出(通常是控制台)。
传入一个字符的 ASCII 码值或者字符常量,函数会将对应的字符输出到控制台。
适用于字符类型。
#include
int main() {
char ch = 'B';
// 输出字符
putchar(ch);
putchar('\n'); // 输出换行符
return 0;
}
在这个例子中,putchar
函数把字符 B
输出到控制台,然后输出一个换行符。
fopen
函数:打开文件 FILE *fopen(const char *filename, const char *mode);
打开指定文件名的文件,并返回一个指向该文件的 FILE
指针。
filename
是要打开的文件的名称,mode
是打开文件的模式,常见的模式有:
"r"
:以只读模式打开文件。"w"
:以写入模式打开文件,如果文件不存在则创建,如果存在则清空内容。"a"
:以追加模式打开文件,如果文件不存在则创建。NULL
,若为 NULL
则表示打开文件失败。fclose
函数关闭文件。适用于文件操作。
#include
int main() {
FILE *file;
// 以只读模式打开文件
file = fopen("test.txt", "r");
if (file == NULL) {
// 输出错误信息
printf("无法打开文件!\n");
return 1;
}
// 这里可以进行文件读取操作
// 关闭文件
fclose(file);
return 0;
}
此例中,fopen
函数尝试以只读模式打开 test.txt
文件,若打开失败则输出错误信息,打开成功后可以进行文件读取操作,最后使用 fclose
函数关闭文件。
fclose
函数:关闭文件 ❌int fclose(FILE *stream);
关闭指定的文件流,释放相关资源。
传入一个指向 FILE
类型的指针,该指针是通过 fopen
函数返回的。
适用于文件操作。
#include
int main() {
FILE *file;
// 以写入模式打开文件
file = fopen("test.txt", "w");
if (file == NULL) {
// 输出错误信息
printf("无法打开文件!\n");
return 1;
}
// 这里可以进行文件写入操作
// 关闭文件
if (fclose(file) == 0) {
printf("文件关闭成功!\n");
} else {
printf("文件关闭失败!\n");
}
return 0;
}
这个例子中,fopen
函数以写入模式打开 test.txt
文件,进行文件写入操作后,使用 fclose
函数关闭文件,并根据返回值判断关闭是否成功。
fgets
函数:安全读取字符串 char *fgets(char *str, int n, FILE *stream);
从指定的文件流中读取一行字符串,并存储到 str
指向的字符数组中。
str
是存储读取字符串的字符数组,n
是最多读取的字符数(包含换行符和字符串结束符 '\0'
),stream
是文件流指针,可以是 stdin
(标准输入)或者通过 fopen
打开的文件指针。
n - 1
或者遇到换行符,读取会停止,并且会在字符串末尾添加 '\0'
。str
指针;若遇到文件结束符或者出错,返回 NULL
。适用于字符串类型。
#include
int main() {
char buffer[100];
// 从标准输入读取一行字符串
printf("请输入一行字符串:");
fgets(buffer, sizeof(buffer), stdin);
// 输出读取的字符串
printf("你输入的字符串是:%s", buffer);
return 0;
}
在这个例子中,fgets
函数从标准输入读取一行字符串,最多读取 sizeof(buffer) - 1
个字符,然后将其存储到 buffer
数组中,并输出该字符串。
fputs
函数:输出字符串到文件 int fputs(const char *str, FILE *stream);
把字符串 str
输出到指定的文件流中。
str
是要输出的字符串,stream
是文件流指针,可以是 stdout
(标准输出)或者通过 fopen
打开的文件指针。
'\n'
。EOF
。适用于字符串类型。
#include
int main() {
FILE *file;
// 以写入模式打开文件
file = fopen("test.txt", "w");
if (file == NULL) {
// 输出错误信息
printf("无法打开文件!\n");
return 1;
}
// 向文件中写入字符串
fputs("Hello, World!\n", file);
// 关闭文件
fclose(file);
return 0;
}
此例中,fopen
函数以写入模式打开 test.txt
文件,fputs
函数把字符串 "Hello, World!\n"
写入文件,最后使用 fclose
函数关闭文件。
通用清空方案:
void clear_buffer() { int c; while ((c = getchar()) != '\n' && c != EOF); }
使用场景:
在scanf()
后立即调用
处理异常输入时
黄金法则:
所有输入函数都要考虑缓冲区溢出风险
文件操作后必须检查返回值并关闭文件
格式化IO要严格匹配类型
掌握这些核心函数,你的C语言IO操作将游刃有余!