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

/*
#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()存储了一个换行符,所以二者输出效果相同。



-------------------------------------------------------------------------------------*/
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值