C语言中的gets函数问题!
看了很多教材都说最好在任何时候拒绝使用gets,因为没有边界检查,有可能引起缓冲区溢出.但是我在看了一本书叫"C语言编程100例"中,有一个例题使用了gets,这样使用安...
看了很多教材都说最好在任何时候拒绝使用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]?? 展开
# 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]?? 展开
展开全部
gets(str)有边界溢出的可能。
比如你的str定义只有80个char单元,但输入的时候却输入了80个以上的字符,那么就发生了溢出。c语言是不检查边界溢出的,编译不报错。但溢出会破坏内存中的数据,产生不可预料的后果。所以要尽量避免。
但平常练习的时候gets()函数是经常用到的,因为它用起来很方便。
我们现在所编写的程序主要是为了学习算法,并不是像专业程序员那样要求严密性,减少BUG。所以你在给字符串定义了一个足够大的长度时用gets()没关系。
话有说回来,保持一个严谨的编程风格也是很有必要的。你自己抉择吧。
text是一个二维数组,gets(text[t])是给text[t]赋值。
比如你的str定义只有80个char单元,但输入的时候却输入了80个以上的字符,那么就发生了溢出。c语言是不检查边界溢出的,编译不报错。但溢出会破坏内存中的数据,产生不可预料的后果。所以要尽量避免。
但平常练习的时候gets()函数是经常用到的,因为它用起来很方便。
我们现在所编写的程序主要是为了学习算法,并不是像专业程序员那样要求严密性,减少BUG。所以你在给字符串定义了一个足够大的长度时用gets()没关系。
话有说回来,保持一个严谨的编程风格也是很有必要的。你自己抉择吧。
text是一个二维数组,gets(text[t])是给text[t]赋值。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询