您的位置:首页 > 其它

gets()、puts()和fgets()、fputs() 的区别。

2015-10-21 16:59 176 查看
/*

#include<stdio.h>

#include<stdlib.h>

#define MAX
81

int main(void)

{

char name[MAX];

char *ptr;

printf("请输入姓名:\n");

ptr = fgets(name, MAX, stdin);

printf("%s? Ah! %s\n", name, ptr);

getchar();

return 0;

}

*/

/*********************************************************************************

请输入姓名:

qinshihuang

qinshihuang

? Ah! qinshihuang

出现了一个问题:理应问号在上一行,却怕跑到了下一行。

问题在于fgets() 把换行符存储到字符串里,这样每次显示字符时就会显示换行符。

我们可以使用strchr()来定位和删除换行符。

***********************************************************************************/

/*---------------------------------------------------------------------------------

gets() 对于交互式程序非常方便。因为没有字符串预定的长度,所以gets()不知道什么时候

结束。解决办法就是读字符串直到遇到一个换行字符(\n),按回车可以产生这个字符。他

读取换行符之前(不包括换行符)的所有字符,这些字符后添加了一个空字符<\0>,然后把这

个字符串交给调用它的程序。它将读取换行符并将其丢弃,这样下一次读取就会在新的一行开始。

gets() 返回一个指向字符串首地址的指针。

由于gets()不检查目标数组是否能够容纳输入,所以很不安全。的确,几年前就有人注意到

NUIX操作系统中代码使用gets(),于是他们利用这个弱点,用很长的输入覆盖操作系统的代码

,从而发明了在UNIX网络上传播的“蠕虫(worm)”.

///***fgets()和gets()有三方面不同:***

1.fgets()需要第二个参数来说明读入字符数。如果这个参数是n, fgets()就会读取最多n-1个字符

或者读完一个换行符为止,这由二者中最先满足的那个来结束输入。

2.如果fgets()读取到换行符,就会把它存到字符串里,而不是像gets()那样丢弃它。

3.他还需要第三个参数来说明读哪一个文件。从键盘上读取数据时,可以使用stdin(standard input)

作为参数,这个标识符在stdio.h中定义。

///***scanf()和gets()***

主要差别在于他们如何决定字符串的结束。

scanf()基于获取单词。gets()基于获取字符串。

scanf()使两种方法决定书输入结束:

1.如果使用%s 格式,那么遇到空白符结束,

2.若指定长度%10s,那么读到第10个结束。

二者先满足谁都结束输入。

gets()结束输入就一种:

遇到换行符。

gets() 更加适用于文本输入。scanf()适用于带有属性的变量输入(也即是有控制符)。

///***printf()和puts()***

puts()输出之后会自动在其后添加一个换行符。

fputs()和puts()

fputs() 下需要第二个参数说明要写的文件。使用stdout进行输出显示。

gets()丢弃输入里的换行符,puts()为输出添加换行符;

fgets()存储输入中的换行符,fputs()不为输出添加换行符。

假定写一个循环,读取一行并把它回显在下一行。

char line[80];

while(gets(line))

puts(line);

char line[80];

while(fgets(line))

fputs(line);

第一个循环中puts()为他添加了换行符,所以每一个数组中的字符都被显示在单独的一行上。

第二个循环中fgets()存储了一个换行符,所以二者输出效果相同。

-------------------------------------------------------------------------------------*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: