c语言的gets
⑴ c语言gets函数
是的,如果这是某书上的做法,那么,我只能说它为你们提供了一个错误的榜样。
这样使用gets()已经发生了溢出!这是gets()不检查数据边界的bug造成的。
另外,“字符串不是总是以'\0'作为串的结束符”,答案是肯定的,不然puts()函数就不能在合适的地方停下来了。这里st[15]被gets()函数赋值为'\0'。这里要说明的是st[15],st[16]是存在而不合法的,因为字符串实际上就等同于指针,类似st[16]是实在的地址但是是不应该被引用的。
为什么这里溢出没有产生错误?可能系统分配内存是以一个最小的大小整段整段的分配(这个我只是猜测)。你可以试着输入的字符串变长一点,就可以看到内存读写出错的提示了,这就是溢出的严重后果!我在DOS系统下测试字符串长了直接当机。
验证1:st[15]被赋值为'\0'
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
printf("%d",st[15]);
getch();
}
验证2:
#include"stdio.h"
main()
{
charst[15];
printf("inputstring:");
gets(st);
puts(st);
//printf("%d",st[16]);
st[1]='\0';
printf("%s\n",st);
printf("%s",st+2);
getch();
}
同样的建议:拒绝gets(),这本来就是一个有bug的函数!
⑵ C语言中gets函数与getchar函数有什么区别
C语言中gets函数与getchar函数的区别
一、函数输入方面
1、gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束,但回车符不属于这个字符串。其调用格式为:gets(s);s为字符串变量(字符串数组名或字符串指针),gets(s)函数与scanf("%s", &s)相似,但不完全相同。
2、而getchar函数运行时字符是连续输入的,运行结果却是正确的,这是因为输入字符后,它们暂存于键盘的缓冲区中,然后由getchar函数从键盘缓冲区中一个一个的取出来。就是如果输入了空格会认为输入字符串结束,空格后的字符将作为下一个输入项处理,但gets() 函数将接收输入的整个字符串直到回车为止。
二、字符输入方面
1、gets()函数可以用于对字符串的输入,不需要将字符串拆分成一个一个的字符进行输入。
2、而getchar函数只能用于单个字符的输入,一次输入一个字符。程序的功能是输入一个字符,显示一个字符,回车换行,再输入并显示一个字符。
三、输出格式
1、gets函数是输入一行字符串,以回车结束,并且回车键会被过滤掉,不会被读回到字符串中。
2、而getchar()是读答取一个字符,包括回车键也会被读成一个字符。这个程序在输入name[i]前,用getchar()把之前scanf("%d",&num[i]);中,输入整数后按的回车键给读走,否则这个回车键会导致gets直接读到一个空字符串。
⑶ C语言gets函数的用法,能用代码举个例子么
c语言,gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'