五一博文连载持续中
目录【输入函数】
scanf函数
前言
scanf 是C语言标准库中的一个输入函数,用于从标准输入(通常是键盘)读取格式化数据。
使用要点
1、变量前必须加& (除了数组名)
int a;
scanf("%d", &a); // 正确
scanf("%d", a); // 错误
2、多个输入值
int x, y;
scanf("%d%d", &x, &y); // 输入时可以用空格/Tab/回车分隔
3、处理输入缓冲区
- 什么是输入缓冲区?
输入缓冲区是内存中的一块临时存储区域,用于存放用户从键盘输入的内容。当你键入内容并按回车时,这些内容会先被放入缓冲区,然后程序再从缓冲区读取。读取字符时要注意缓冲区中的换行符
int age;
char ch;
scanf("%d", &age);
scanf(" %c", &ch); // 注意%c前的空格,用于跳过空白字符
4、返回值
- 返回成功读取的数据项数
可用于判断输入是否成功
if(scanf("%d", &num) != 1) {
printf("输入错误!");
}
5、注意问题
- 使用%s时要小心缓冲区溢出
可以指定最大读取长度
char name[20];
scanf("%19s", name); // 最多读取19个字符,留1个给'\0'
- scanf 不能直接输出提示信息
scanf("请输入一个数值:%d",&num);//报错
scanf 只用于读取输入,不能像 printf 那样显示提示信息。
应该先用 printf 输出提示,再用 scanf 读取输入。
6、关于VS的scanf的安全性警报问题
先来看下面的一段代码
#include <stdio.h>
int main() {
int year = 0;
printf("请输入年份:"); // 提示用户输入
scanf("%d", &year); // 读取用户输入
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
printf("%d是闰年\n", year);
}
else {
printf("%d不是闰年\n", year); // 补充非闰年的情况
}
return 0;
}
代码运行结果如下

这个错误是Visual Studio 编译器针对scanf()函数的安全警告,是属于比较常见的问题
解决方法(3种方式,任选其一):
- 方法1:改用 scanf_s(微软推荐)
scanf_s("%d", &year); // 安全版本,但仅适用于Windows/MSVC
缺点 :scanf_s 不是标准C函数,在其他编译器(如GCC、Clang)可能无法使用。
- 方法2:禁用这个特定警告(常用方法)
在代码文件 最开头 添加宏定义:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
缺点:这样编译器就不会再提示 scanf 不安全。
- 方法3:彻底关闭安全警告(不推荐)
在项目属性里设置:
右键项目 → 属性 → C/C++ → 预处理器
在 预处理器定义 中添加:
_CRT_SECURE_NO_WARNINGS
应用并重新编译。
getchar函数
1. getchar() - 读取单个字符
- 从标准输入读取单个字符
返回读取的字符(转为int类型),失败返回EOF
char ch = getchar(); // 读取一个字符
2. fgets() - 安全读取字符串
- 最简单的 fgets 使用模板
#include <stdio.h>
int main() {
char buffer[100]; // 定义一个足够大的字符数组
printf("请输入内容: ");
fgets(buffer, sizeof(buffer), stdin); // 读取输入
printf("你输入的是: %s", buffer);
return 0;
}
关键要点:
三个必要参数:
buffer:存储输入的字符数组
sizeof(buffer):最大读取长度(自动计算数组大小)
stdin:表示从标准输入(键盘)读取
自动添加结束符:
fgets 会自动在字符串末尾添加 \0
所以实际读取的字符数 = 指定长度 - 1
推荐实践
读取字符串:优先使用fgets
char name[50];
fgets(name, 50, stdin);
混合输入:结合fgets和sscanf
char buffer[100];
int age;
fgets(buffer, 100, stdin);
scanf(buffer, "%d", &age); // 从字符串解析
逐字符处理:使用getchar或fgetc
while((ch = getchar()) != '\n') {
// 处理每个字符
}
这些函数比scanf更安全、更可控,特别是在处理用户输入时能避免很多常见问题。
写完这篇文章,小编又要准备躺平平了
如果你觉得这篇文章对你有帮助的话
请给小编一个三连支持一下



2419

被折叠的 条评论
为什么被折叠?



