C语言中scanf(),sscanf(),fscanf()的用法和区别

scanf(),sscanf(),fscanf()区别:
第一个是从控制台(键盘)输入;
第二个是从字符串输入;
第三个是从文件输入;
scanf
scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并保存数据到其它参数. 
 int main()
{
   int a,b,c;
   printf("输入:a,b,c\n");
   scanf("%d,%d,%d",&a,&b,&c);
   printf("a = %d b = %d c = %d",a,b,c);
   return 0;
}
 
 
 
sscanf
函数sscanf()和scanf()类似, 只是输入从buffer(缓冲区)中读取.
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源
用法:
%[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是”^”,则表示反意思。[ ]内的字符串可以是1或更多字符组成。空字符集(%[])是违反规定的,可导致不可预知的结果。%[^]也是违反规定的。
 
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("123456 abcdedf", "%[^ ]", 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。
        


%[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停止,如
 
               char s[]="hello, my friend” ; // 注意: ,逗号在不 a-z之间


               sscanf( s, “%[a-z]”, string ) ; // string=hello
  


%[^a-z] 读取不在 a-z 之间的字符串,如果碰到a-z之间的字符则停止,如


               char s[]="HELLOkitty” ; // 注意: ,逗号在不 a-z之间
 
              sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
 


%*[^=] 前面带 * 号表示不保存变量。跳过符合条件的字符串。


              char s[]="notepad=1.0.0.1001" ;


               char szfilename [32] = "" ;


               int i = sscanf( s, "%*[^=]", szfilename ) ;// szfilename=NULL,因为没保存
 
               intj = sscanf( s, "%*[^=]=%s", szfilename ) ;// szfilename=1.0.0.1001
 
 
%[^=] 读取字符串直到碰到’=’号,’^’后面可以带更多字符,如:


              char s[]="notepad=1.0.0.1001" ;


              char szfilename [32] = "" ;


               int i = sscanf( s, "%[^=]", szfilename ) ;   // szfilename=notepad
 
               如果参数格式是:%[^=:] ,那么也可以从 notepad:1.0.0.1001读取notepad
 
 
fscanf()
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。


int fscanf(FILE *stream, const char *format,[argument...]);
FILE *stream:文件指针;
char *format:格式字符串;
[argument...]:输入列表。


例1:
FILE *fp;
char a[10];
int b;
double c;
fscanf(fp,"%s%d%lf",a,&b,&c)
返回值:整型,成功读入的参数的个数
 
例2:
char* filename = "pt.txt";
FILE *fp;
if((fp=fopen(filename,"r"))!=NULL)
 {  
   char str[1024];
   fscanf(fp,"h = %s\n",str);//txt文件中就类似这种格式:h = dadf;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值