今天在linux编程,用到gets函数,从键盘输入字符。但是由于gets函数没有限制域,当你输入的字符超出限制时,就会覆盖原有的字符。在编译的时候,会警告
“warning:the gets function is dangerous and should not be used", 事实上,gets函数也仅仅应用在玩具程序上面。
而fgets函数则能够消除这个缺点,fgets 函数作为键盘输入的时候,他的使用格式如下
fgets(str,n,stdin) ;其中str可以是数组名,n是输入的字符的输入限制值,stdin是标准输入指针。这里就是指键盘。
与gets相比使用这个好处是:可以读取指定大小的数据,避免gets函数从stdin接收字符串而不检查它所复制的缓存的容积导致的缓存溢出问题。
#include<stdio.h>
#include<string.h>
main()
{
int length;
char str[80];
fgets(str,6,stdin);
/**/ str[strlen(str)-1]='\0';
length=strlen(str);
printf("the value is:%s",str);
printf("the length is:%d",length);
}
我们先把/**/句屏蔽掉,运行的时候。
行数 输入 输出1 (第一个printf) 输出2(第二个printf)
1 a a 2
2 abc abc 4
3 abcd abcd 5
4 abcde abcde 5
5 abcdef abcde 5
由此我们知道, 在前三行的时候,结束输入的时候,系统会追加一个\n,并且在字符长度上会计入,
但是在第四行的时候,此时数组的值应是“abcde\n",但是这时数组长度还是5,
所以当输入的字符<=n-2时,才会把\n当成一个字符计入。
但是fgets函数在百科的介绍上说一定要加上上文所屏蔽的那句话的啊,str[strlen(str)-1]='\0'; 因为字符串是以\0结尾的啊。
加上那句话,运行结果又怎样呢?? look down!!!!
行数 输入 输出1 (第一个printf) 输出2(第二个printf)
1 a a 1
2 abc abc 3
3 abcd abcd 4
4 abcde abcd 4
5 abcdef abcd 4
下面解释原因:
当输入a时,strlen(str)=2; str[0]=a, str[1]=\n. 然后执行屏蔽句,即str[1]=\0,此时再计算数组的长度,肯定是1了呀。其他的可以以此类推。