首 页最新软件下载排行资讯教程下载专题投稿发布
pc软件下载资讯
您的位置:首 页编程开发 → c语言编程技巧:c语言sscanf,scanf,fscanf正则表达式用法技巧

c语言编程技巧:c语言sscanf,scanf,fscanf正则表达式用法技巧

作者:维维 日期:2018-4-20 8:08:05 人气:

c语言sscanf,scanf,fscanf正则表达式用法技巧分享,今天小编要给各位朋友分享的是关于c语言sscanf,scanf,fscanf正则表达式用法心得,由于每一种语言都对正则表达式有着不同程度的支持,而在C语言之中,有输入功能的这3个函数对正则表达式的支持并不是很强大,不过我们还是很有必要了解一下的,有兴趣的朋友赶紧来看看吧。

首先咱们先看看他们的原型:

#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);

均能够接受变参,sscanf与scanf类似,能够将标准输入(stdin)作为输入源。最关键的部分,就是format这个参数了。它能是一个或者多个 {%

  • [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}。

    参数解释:

    1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过该数据不读入. (也就是不将此数据读入参数中)

    2、{a|b|c}表示a,b,c中选一,[d],表示能够有d也能够没有d。

    3、width表示读取宽度。

    4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。

    5、type : 就是%s,%d之类。

    6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值

    支持的集合操作:%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)%[aB'] 匹配a、B、'中一员,贪婪性%[^a] 匹配非a的任意字符,贪婪性

    返回值

    这三个函数返回成功匹配和分配的输入项。意思是你在format参数列表中的格式,返回值能够比你提供的匹配项目数少(有些将会匹配失败)。提前匹配失败则返回0。若达到文件末尾,则返回EOF,当发生错误时也将返回EOF。你能够通过输出errno来查看错误代码。

    若使用fscanf来判断文件是否结束,将会存在安全隐患,若每一次读取的时候都是匹配失败,那么返回值永远都不会是EOF。scanf族的函数都是要先将数据读入缓冲区,然后在冲缓冲里读取。

    注意:scanf族函数会忽略一行开始的空白

    sscanf/scanf正则用法

    %[ ] 的用法:

    %[ ] 表示要读入一个字符集合 , 若 [ 后面第一个字符是 ”^” ,则表示反意思。

    [ ] 内的字符串可以是 1 或更多字符组成。空字符集( %[] )是违反规定的,可能导致不可预知的结果。 %[^] 也是违反规定的。

    %[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, 因为没有保存
    int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001

    %40c 读取 40 个字符

    The run-time
     library does not automatically append a null terminator to the string, nor does reading 40 characters
     automatically terminate the scanf() function. Because the library uses buffered input, you must press the ENTER key to terminate the string scan. If you press the ENTER before the scanf() reads 40 characters, it is displayed normally, and the library continues to prompt for additional input until it reads 40 characters

    %[^=] 读取字符串直到碰到 '=' 号, '^' 后面能够带更多字符,比如:

    char s[]="notepad=1.0.0.1001" ;
    char szfilename [32] = "" ;
    int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad

    若参数格式是: %[^=:] ,那么也可以从 notepad:1.0.0.1001 读取 notepad

    使用例子:

    char s[]="notepad=1.0.0.1001" ;
    char szname [32] = "" ;
    char szver [32] = “” ;
    sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001

    总结: %[] 有很大的功能,不过并不是经常用到,主要因为:

    1.许多系统的 scanf 函数都有漏洞. (典型的就是 TC 在输入浮点型时有时会出错).
    2.用法复杂 , 容易出错 .
    3.编译器作语法分析时会很困难,从而影响目标代码的质量和执行效率 .

    个人觉得第3点最致命,越复杂的功能往往执行效率越低下。而一些简单的字符串分析我们可自已处理。

    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。

    本类热门阅览
    栏目导航
    相关下载