一个凶险的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。

posted @ 2010-11-01 14:52  garbageMan  阅读(2287)  评论(13编辑  收藏  举报