C语言中的gets函数问题!

来源:百度知道 编辑:UC知道 时间:2024/06/13 23:55:36
看了很多教材都说最好在任何时候拒绝使用gets,因为没有边界检查,有可能引起缓冲区溢出.但是我在看了一本书叫"C语言编程100例"中,有一个例题使用了gets,这样使用安全吗?

# include <stdio.h>
/* 宏定义 */
# define MAX 100
# define LEN 80

/* 一个非常简单的文本编辑器 */
void main()
{
char text[MAX][LEN];
register int t, i, j; /* 定义三个寄存器变量 */
/* 逐行输入字符串 */
for(t=0; t<MAX; t++)
{
printf("%d: ", t);
gets(text[t]);
if(!text[t][0])
break; /* 空行退出 */
}

/* 按行,逐个字符输出字符串 */
for(i=0; i<t; i++)
{
for(j=0; text[i][j]; j++)
putchar(text[i][j]);
putchar('\n');
}
}

请指点,谢谢
还有对这句话我不甚理解: gets(text[t]); 为什么括号里是text[t]??

首先这里如果行数超过MAX,输入字符超过LEN就会错。其次应该没问题。
你可以自己运行一下试试看。
gets(text[t])是把输入的字符串读入text[t]
text是个二维数组,比如第一行是abc,那么
text[0][0]='a'
text[0][1]='b'....
text[0] = 'abc\0'吧……

gets(str)有边界溢出的可能。
比如你的str定义只有80个char单元,但输入的时候却输入了80个以上的字符,那么就发生了溢出。c语言是不检查边界溢出的,编译不报错。但溢出会破坏内存中的数据,产生不可预料的后果。所以要尽量避免。
但平常练习的时候gets()函数是经常用到的,因为它用起来很方便。
我们现在所编写的程序主要是为了学习算法,并不是像专业程序员那样要求严密性,减少BUG。所以你在给字符串定义了一个足够大的长度时用gets()没关系。
话有说回来,保持一个严谨的编程风格也是很有必要的。你自己抉择吧。
text是一个二维数组,gets(text[t])是给text[t]赋值。