一个凶险的BUG
【
c格式符用来输入单个字符(scanf()函数)。
char ch;
scanf("%3c",&ch);
如果从键盘连续输入3个字符“abc”,由于ch只能容纳一个字符,系统就把第一个字符'a'赋给字符变量ch。
】
果真如此么?考察一下下面的代码
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char __ch = 'E', _ch = 'R' , ch = 'R' ;
printf("最初__ch,_ch,ch为%c%c%c\n", __ch , _ch , ch);
printf("输入3个字符:");
scanf ("%3c",&ch);
printf("最后__ch,_ch,ch为%c%c%c\n", __ch , _ch , ch);
system("PAUSE");
return 0;
}
运行的结果是:
最初__ch,_ch,ch为ERR
输入3个字符:abc
最后__ch,_ch,ch为cba
请按任意键继续. . .
不难发现,输入的abc三个字符都被写入了内存。意外地改变内存中的数据,这是非常危险的事情。就如同
int *p ;
*p = 3 ;
一样凶险。
事实上,scanf()函数中的%c并非是用来输入单个字符的,而是用来输入一组字符的。例如
char c_a[3];
scanf("%3c" , c_a );
其中的3规定了输入数据的宽度。
当然,宽度为1的时候,%c确实可以用来输入单个字符。但是认为%c这个格式转换只是“用来输入单个字符”却是大错特错,而且可能会产生一个很严重的潜在的BUG。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架