学了C语言很久了,一直不太懂字符串中gets与puts的意义,现在马上期末考试了,很困惑,希望大神可以教我一下,谢谢
gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。
(1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。 (2). 可以将字符串直接写入puts()函数中。如: puts("Hello, Turbo C2.0");
#include
#define SIZE_BUF 5
int main(void)
{
char buffer[SIZE_BUF] = {0};
gets(buffer);
puts(buffer);
return 0;
}
首先gets函数从标准输入(stdin,可以理解为你的键盘)读取数据(字符),参数为一个指针,然后将读取到的字符一个一个写入到指针指向的缓冲区buffer中,也就是这个数组中,其实gets在写的时候,是一个一个写的(毕竟你也是一个一个敲进去的,读到'\0'结束),也就是说写一个,数组下标就加一(人家函数自己实现的嘛)。当数组下标超过就会报段错误(未必,你可以用这个代码试一下,稍微大个一两个字符可能没错误,但是大的多就会报错,这是由于内存分配的机制导致的)。但是有一点可以确定,当gets操作的地址不存在权限时就属于绝对性越界了。所以只要输入的字符串长度小于自定义的buffer长度就行,毕竟这种函数与缓存技术与内存管理都挂钩所以分配多少用多少,不要超过就行,不要去作死超出一两个,虽然可能不报错,但是还是有隐患的!!而puts相比较就简单了,其参数为一个指针(buffer数组名也是一个常指针),就是把这个指针指向的字符串输出到标准输出中(stdout,可以理解为屏幕,它也是一个一个写的,读到'\0'结束)。
最后总结一下:
gets:stdin -> buffer
puts:buffer -> stdout
建议你了解了解缓存或者缓冲概念与标准输入输出。再看一下fgets和fputs这两个函数,或许会理解深刻一点。
在这个文章最后有关于输入char类型的代码,建议不要用gets和scanf http://m.blog.csdn.net/article/details?id=53647708
编程语言类对于语法有任何困惑,建议首先查看书籍或博文了解具体的语法,然后自己动手实践体会,这样学起来才深刻