怎样防止用户向一个内存区域中输人过多的字符?
有两个原因要防止用户向一个内存区域中输入过多的字符:第一,你可能只希望处理固定数目的字符;第二,可能也是更重要的原因,如果用户输入的字符数超过了缓冲区的容量,就会溢出缓冲区并且破坏相邻的内存数据。这种潜在的危险在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.
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.