scanf 是C语言标准库中的一个输入函数,用于从标准输入(通常是键盘)读取格式化数据。
int a;
scanf("%d", &a); // 正确
scanf("%d", a); // 错误int x, y;
scanf("%d%d", &x, &y); // 输入时可以用空格/Tab/回车分隔int age;
char ch;
scanf("%d", &age);
scanf(" %c", &ch); // 注意%c前的空格,用于跳过空白字符if(scanf("%d", &num) != 1) {
printf("输入错误!");
}char name[20];
scanf("%19s", name); // 最多读取19个字符,留1个给'\0'scanf("请输入一个数值:%d",&num);//报错scanf 只用于读取输入,不能像 printf 那样显示提示信息。
应该先用 printf 输出提示,再用 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种方式,任选其一):
scanf_s("%d", &year); // 安全版本,但仅适用于Windows/MSVC缺点 :scanf_s 不是标准C函数,在其他编译器(如GCC、Clang)可能无法使用。
在代码文件 最开头 添加宏定义:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>缺点:这样编译器就不会再提示 scanf 不安全。
在项目属性里设置: 右键项目 → 属性 → C/C++ → 预处理器 在 预处理器定义 中添加: _CRT_SECURE_NO_WARNINGS 应用并重新编译。
char ch = getchar(); // 读取一个字符#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
char name[50];
fgets(name, 50, stdin);char buffer[100];
int age;
fgets(buffer, 100, stdin);
scanf(buffer, "%d", &age); // 从字符串解析while((ch = getchar()) != '\n') {
// 处理每个字符
}这些函数比scanf更安全、更可控,特别是在处理用户输入时能避免很多常见问题。