欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > 避雷 :C语言中 scanf() 函数的错误❌使用!!!

避雷 :C语言中 scanf() 函数的错误❌使用!!!

2025/4/2 0:05:47 来源:https://blog.csdn.net/2301_76781059/article/details/146362427  浏览:    关键词:避雷 :C语言中 scanf() 函数的错误❌使用!!!

1. 返回值说明

scanf函数会返回成功匹配并赋值的输入项个数,而不是返回输入的数据

可以通过检查返回值数量来确认输入是否成功。若返回值与预期不符,就表明输入存在问题。

#include <stdio.h>int main() {int num;if (scanf("%d", &num) != 1) {  //1是指scanf 函数返回成功匹配并赋值的输入项个数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 10int 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还有自己的一些理解写的一些总结。如果有不足处,欢迎评论区指出,如果对你有帮助,那可以给我一个👍赞吗

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词