您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-25 09:23 615 查看
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;

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