关于sscanf

来源:互联网 发布:php屏蔽js广告 编辑:程序博客网 时间:2024/05/22 13:49
 最近自己在做一个基于linux的web server,目的就是为了练练手,巩固一下学到的知识。在写配置文件读取模块的时候,我被卡住了。 眼下有两种选择,因为是值,信息的形式,又是比较简单的选项,觉得也没必要写到XML文件里,所以,有如下想法,一是把文件读到内存里,拆分成行,再读取等号后面的值。这就需要自己写字符串解析的函数了。 二就是寻找一下现成的东西,我查了一下字符串操作函数,似乎也没有看到可以直接解析的函数。这时,脑子里突然想起了Richard Stevens 写的UNIX网络编程里的TCP协议分割包时使用的函数: sscanf,这个似乎支持正则表达式,可以直接把想要的值解析出来。于是,上网查了一下sscanf的用法,摘抄如下
 名称:
  sscanf() - 从一个字符串中读进与指定格式相符的数据.
  函数原型:
  Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
  int scanf( const char *format [,argument]... );
  说明:
  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的任意字符,贪婪性
根据用法的提示,我设计的读取配置文件的方式如下:
  1 配置文件格式:
    port=8080
    root=xxxx/xxxx
    homepage=xxxx.htm
 2 根据如上格式写出的正则表达式;
  
   sscanf(buf,"%*[a-z|A-Z]=%[0-9]%*[/n| ]%*[a-z]=%[a-z|A-Z|/|0-9]%*[/n| ]%*[a-z]=%[a-z|A-Z|/|0-9|.]", porttmp,path,file);
   简单解释一下:
  buf表示从文件中读取出来的信息.
   后面的正则表达式有三个等式,均为变量--值形式的。 第一个等式为%*[a-z|A-Z]=%[0-9],其中%* 表示忽略变量的名称,因为是固定的。后面的%[0-9]
表示只匹配数字,因为端口是用数字表示的.
   %*[/n| ]表示忽略下面的回车和空格.
   %*[a-z]=%[a-z|A-Z|/|0-9] 这个和上一个等式意义是一样的,只是路径名称可能是字符,也可能是数字.
 这样,很轻松的就可以把想要的内容读取到变量里了.
原创粉丝点击