请选择 进入手机版 | 继续访问电脑版
贠老师培训群:150322713    贠老师QQ:767708506

贠老师office培训-excel学习网

 找回密码
 立即注册
点击咨询贠老师
查看: 190|回复: 5

[C语言] 怎样防止用户向一个内存区域中输人过多的字符?

[复制链接]

3172

主题

3269

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
22691
发表于 2015-12-24 22:21:21 | 显示全部楼层 |阅读模式
有两个原因要防止用户向一个内存区域中输入过多的字符:第一,你可能只希望处理固定数目的字符;第二,可能也是更重要的原因,如果用户输入的字符数超过了缓冲区的容量,就会溢出缓冲区并且破坏相邻的内存数据。这种潜在的危险在C指南书籍中常常会被忽略。例如,对于下面的这段代码,如果用户输入的字符超过了50个,那将是很危险的:
  char bufE50];
  scanf("%s",buf);
解决这个问题的办法是在scanf()中指定要读入的字符串的最大长度,即在“%”和“s”之间插入一个数字,例如:
    "%50s"
这样,scanf()将最多从用户那里接受50个字符,任何多余的字符都将保留在输入缓冲区中,并且可以被其它的scanf()所获取。

还有一点需要注意,即字符串需要有一个NUL终止符。因此,如果要从用户那里接受50个字符,那么字符串的长度必须是51,即50个字符供真正的字符串数据使用,还有一个字节供NUL终止符使用。

下面的程序测试了这种方法:
# include <stdio. h>
/*
      Program to show how to stop the
      user from typing too many characters in
      a field.
*/
int main()
{
      char str[50]; /* This is larger than you really need * /
    /*
       Now, accept only TEN characters from the user. You can test
          this by typing more than ten characters here and seeing
          what is printed.
     */
      scanf( "%10s", str);
     /*
          Print the string, verifying that it is, at most, ten characters.
     */
       printf( "The output is : %s. \n", str) ;
       return (0) ;
下面是这个程序的一个运行例子。当输入supercalifragilisticexpialidocious后,程序将输出supercalif.
回复

使用道具 举报

2

主题

920

帖子

87

积分

注册会员

Rank: 2

积分
87
发表于 2016-1-17 17:30:21 | 显示全部楼层
佩服你,能发这么好的帖子,厉害
回复 支持 反对

使用道具 举报

0

主题

775

帖子

783

积分

高级会员

Rank: 4

积分
783
发表于 2017-3-9 16:50:12 | 显示全部楼层
顶楼主,帮你顶个贴,我挣个积分
回复 支持 反对

使用道具 举报

0

主题

879

帖子

10

积分

注册会员

Rank: 2

积分
10
发表于 2017-6-17 11:57:37 | 显示全部楼层
还有许多问题不明白,有点恼火啊!
回复 支持 反对

使用道具 举报

0

主题

633

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2017-11-4 20:22:19 | 显示全部楼层
很不错的帖子,又学到了,力挺
回复 支持 反对

使用道具 举报

0

主题

903

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2018-10-19 17:13:41 | 显示全部楼层
谢谢您的分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



陕ICP备15003731号  

贠老师培训 GMT+8, 2018-11-21 01:59 , Processed in 0.214285 second(s), 33 queries .

快速回复 返回顶部 返回列表