用%1s读取字符的一种潜在的危险
来源:互联网 发布:ubuntu vmdk文件下载 编辑:程序博客网 时间:2024/04/28 04:31
今天在做OJ时遇到了一个奇怪的问题,就是用scanf(“%1s”,...)读取字符时,发现会改变其他地方的值,经调试发现了问题所在,首先看一下代码
char c;int state[Len][Len];for(i = 0;i < Len;i++){ for(j = 0;j < Len;j++){ scanf("%1s",&c);if(c == '+'){ state[i][j] ^= 1; for(k = 0;k < Len;k++){ state[i][k] ^= 1; state[k][j] ^= 1; }} }
这段代码的一个问题是state[0][0]的值总是莫名奇妙的改变,但是仔细的想一下,其实确实会是改变的。因为c声明的是字符,在读取时为了避免读取空格和换行,我们按字符串读取,虽然只读取一个字符,但是系统会自动添加一个\0,这就是问题所在了,字符c和数组state都会在栈上分配,而且两者的空间是连续的,所以读取c时,系统自动添加的\0会覆盖掉state[0][0],所以state[0][0]会自己改变,这即可以说是C 语言的一个陷阱,也可以说是自己的基础不够扎实。
所以,比较好的办法是这样读取字符:
char c[2];scanf("%1s",c);这样便可以避免 上述问题,使用时用c[0]。
- 用%1s读取字符的一种潜在的危险
- OLE2A的潜在危险
- Cloneable接口潜在的危险
- 整型表达式比较的潜在危险
- 整型表达式比较的潜在危险
- 关于脚本潜在危险的解决办法
- 有潜在危险的非法字符保存在Request中解决办法
- 请求的值。respone.form有潜在的危险
- 用kindeditor提交 检测到有潜在危险的 Request.Form 值
- 检测到有潜在危险的 Request.Form
- 客户端检测到有潜在危险的Request.Form 值
- “检测到有潜在危险的 Request.Form 值”
- 检测到有潜在危险的 Request.Form 值
- 客户端检测潜在危险的Request.Form值
- 多层函数参数非const引用潜在的危险
- 检测到有潜在危险的 Request.Form 值
- 检测到有潜在危险的 Request.Form 值问题
- 检测到有潜在危险的Request.Form 值 解决方法
- 从函数重载到函数模板
- warning
- 第三章 栈和队列 填空题
- java设计模式----factory
- Android程序打开和关闭输入法
- 用%1s读取字符的一种潜在的危险
- Android Studio来了,它能取代Eclipse吗?
- ubuntu 内核编译出错
- [小代码]连接MySQL数据库(android,php,MySQL)
- 在家里不能正常使用VPN
- VB.Net机房收费系统(三层)——用datagirdview 控件显示数据库数据
- iPhone开发中的代码签名
- 中断解析
- ext2读取并产生间接块和数据块