避雷 :C语言中 scanf() 函数的错误❌使用!!!
1. 返回值说明
scanf函数
会返回成功匹配并赋值的输入项个数,而不是返回输入的数据。
可以通过检查返回值数量来确认输入是否成功。若返回值与预期不符,就表明输入存在问题。
#include <stdio.h>
int main() {
int num;
if (scanf("%d", &num) != 1) { //1是指输入的数据个数
printf("输入无效,请输入一个整数。\n");
return 1;
}
printf("你输入的整数是: %d\n", num);
return 0;
}
2. 地址传递
给 scanf
函数传递变量时,要传递变量的地址(即使用 &
运算符),这样 scanf
才能把输入的值存储到变量所在的内存位置。
#include <stdio.h>
int main() {
int num;
// 正确用法
scanf("%d", &num);
// 错误用法:scanf("%d", num);
return 0;
}
3. 输入缓存区问题
scanf
读取输入后,输入缓冲区可能会残留一些字符(如用户输入了回车->换行符 \n
),这可能会对后续的输入操作产生影响。
#include <stdio.h>
int main() {
int num;
char ch;
scanf("%d", &num); //这里模拟用户输入整数后还按了回车
getchar(); // 消耗掉输入缓冲区的换行符
/*
当用户输入整数并按下回车键时,回车键产生的换行符 \n 会留在输入缓冲区里。
若不把这个换行符消耗掉,后续的 scanf("%c", &ch); 就会读取到这个换行符,而非用户输入的字符。
getchar() 函数的作用就是从输入缓冲区读取一个字符,这里它读取的就是换行符。
*/
scanf("%c", &ch); //&ch 表示把用户输入的字符存到 ch 变量的内存地址中。
return 0;
}
4. 格式控制字符串
(1)匹配输入
格式控制字符串要和输入的数据类型相匹配。例如,读取整数用 %d
,读取浮点数用 %f
等。
#include <stdio.h>
int main() {
int num;
float f;
scanf("%d", &num);
scanf("%f", &f);
return 0;
}
(2)空格和特殊字符
格式控制字符串里的空格、制表符和换行符会匹配输入中的任意空白字符序列。其他非格式说明符的字符必须和输入中的字符精确匹配。
#include <stdio.h>
int main() {
int a, b;
// 输入时需要输入 a=1 b=2 这样的格式
scanf("a=%d b=%d", &a, &b);
/*
注意如果平时只需要输入一个值,则后面不要加空格。
即:scanf("%d ", &a); 这种写法是❌错误的
*/
return 0;
}
5. 防止缓冲区溢出
使用 scanf
读取字符串时(%s
),要留意防止缓冲区溢出。可以使用宽度限定符来限制读取的字符数量。
#include <stdio.h>
#define MAX_LENGTH 10
int main() {
char str[MAX_LENGTH];
// 最多读取 MAX_LENGTH - 1 个字符,为字符串结束符 '\0' 留位置
scanf("%9s", str);
return 0;
}
6. 不同类型的混合使用
要注意输入格式和顺序,防止出现意外结果。
#include <stdio.h>
int main() {
int num;
char str[10];
// 先输入整数,再输入字符串
scanf("%d %s", &num, str);
return 0;
}
7. 错误处理
scanf
函数可能会因为输入不匹配、文件结束等原因失败,要对这些情况进行适当的错误处理。
#include <stdio.h>
int main() {
int num;
if (scanf("%d", &num) != 1) {
if (feof(stdin)) {
printf("输入结束。\n");
} else {
printf("输入错误。\n");
}
return 1;
}
return 0;
}
因为今天又在scanf函数上栽了跟头,所以今天终于决定将scanf容易踩的抗自我做一个总结。以上是自己结合AI还有自己的一些理解写的一些总结。如果有不足处,欢迎评论区指出,如果对你有帮助,那可以给我一个👍赞吗