fgets()函数和sscanf()函数的使用方法

fgets

百度百科:从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中。每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),假设文件里的该行,不足bufsize个字符,则读完该行就结束。如若该行(包含最后一个换行符)的字符数超过bufsize-1,则fgets仅仅返回一个不完整的行,可是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行。函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来推断函数是否是出错而终止的,应该借助feof函数或者ferror函数来推断。

函数原型:
     char *fgets(char *buf, int bufsize, FILE *stream);
     *buf: 字符型指针。指向用来存储所得数据的地址。
     bufsize: 整型数据,指明存储数据的大小。
     *stream: 文件结构体指针,将要读取的文件流。

    返回值:
成功,则返回第一个參数buf;
      在读字符时遇到 end-of-file,则eof指示器被设置,假设还没读入不论什么字符就遇到这样的情况,则buf保持原来的        内容。返回NULL;
      假设发生读入错误。error指示器被设置,返回NULL。buf的值可能被改变。

 


     <strong>例(fgets()函数举例):</strong>
	假设一个文件的当前位置的文本例如以下
	Love, I Have
	Since you can do it.
	假设用fgets(str1,6,file1);去读取
	则运行后str1 = "Love," ,读取了6-1=5个字符
	这个时候再运行fgets(str1,20,file1)则运行后str1 = " I Have\n"
	而假设
	fgets(str1,23,file1);
	则运行str1="Love ,I Have"。读取了一行(包含行尾的'\n',并自己主动加上字符串结束符'\0'),当前文件位置移至下一行。         尽管23大于当前行上字符总和,但是不会继续到下一行。

而下一次调用fgets()继续读取的时候是从下一行開始读。


sscanf

百度百科:sscanf() - 从一个字符串中读进与指定格式相符的数据。


          函数原型:
 int sscanf( const char *, const char *, ...);
 int sscanf(const char *buffer,const char *format,[argument ]...);
   buffer存储的数据。
 format格式控制字符串。

 argument: 选择性设定字符串。
 sscanf会从buffer里读进数据。按照format的格式将数据写入到argument里。

返回值:
成功则返回參数数目。失败则返回-1,错误原因存于errno中。
           经多次測试,在linux系统中成功返回的是所有參数值减2,比如:sscanf("1 2 3","%d %d %d",buf1, buf2, buf3); 成功调用返回值为3,即buf的数量(总參数个数减前两个)。(注意:此处buf均为地址)

样例:
1. 常见使用方法。


char buf[512];
sscanf("123456","%s",buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!
printf("%s\n",buf);
结果为:123456
   2. 取指定长度的字符串。

如在下例中,取最大长度为4字节的字符串。


sscanf("123456","%4s",buf);
printf("%s\n",buf);
结果为:1234
   3. 取到指定字符为止的字符串。如在下例中。取遇到随意小写字母为止的字符串。
sscanf("123456abcdedf","%[^a-z]",buf);
printf("%s\n",buf);
结果为:123456
   4. 取仅包括指定字符集的字符串。

如在下例中。取仅包括1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF","%[1-9a-z]",buf);
printf("%s\n",buf);
结果为:123456abcdedf
当输入:  sscanf("123456abcdedfBCDEF","%[1-9A-Z]",buf);
printf("%s\n",buf);
结果为:123456
   5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。


sscanf("123456abcdedfBCDEF","%[^A-Z]",buf);
printf("%s\n",buf);
结果为:123456abcdedf
   6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串。
先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]",buf);
printf("%s\n",buf);
结果为:12DDWDFF
   7、给定一个字符串“hello, world”,仅保留world。
(注意:“。”之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串)
sscanf(“hello, world”,"%*s%s",buf);
printf("%s\n",buf);
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即“hello,”被过滤了
假设没有空格则结果为NULL。




综合举例:

#include <stdio.h>
  #include <stdlib.h>
  
  int main(void)
  {   
      char buf[256];
      int size;
       
      printf("please input array size:");
      fgets(buf,256,stdin);// stdin是从键盘输入
      sscanf(buf,"%d",&size);
      printf("The size of array is :%d",size);//结果就是你输入的值咯<img alt="得意" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/proud.gif" />
      return 0;
  }





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值