Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2631478
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4193
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: C/C++

2010-06-10 10:49:25

参考:
今天看到一个程序中sscanf() 的用法,比较有效,以前从来没有注意到,然后就查了一个它的帮助手册,其实以前也看过,只是大概浏览了一下,没有细细口味。

// gcc -o sscanTest sscanTest.c
#include
#include
int main(int argc, char **argv)
{
 char sentence []="Rudolph is 12 years old";
  char str [20];
  char str2 [20];
  char buf[128], buf2[128];
  int i;
  int a, b, c;
  char sztime1[16] = "", sztime2[16] = "";
 
  memset(buf, 0, 128);
  sscanf (sentence,"%s %*s %d %s",str,&i, str2);
  printf ("result100= %s -> %d -> %s\n",str, i, str2);
 
  memset(buf, 0, 128);
  sscanf("123456 ", "%3s", buf);
  printf("result101= %s\n", buf);
 
  memset(buf, 0, 128);
  sscanf("123456 abcdedf", "%[^ ]", buf);
  printf("result102= %s\n", buf);
 
  memset(buf, 0, 128);
  sscanf("123456abWWQcdedfBCDEF", "%*[1-9a-z]%s", buf);
  printf("result103= %s\n", buf);
  memset(buf, 0, 128);
  sscanf("123456abWWQcdedfBCDEF", "%[1-9a-z]", buf);
  printf("result1031= %s\n", buf);
 
 
  memset(buf, 0, 128);
  memset(buf2, 0, 128);
  sscanf("bC123456abcdedfBCDEF", "%*[^A-Z]%c%*[0-9]%s", buf, buf2);
  printf("result104= %s, %s\n", buf, buf2);
 
 
  memset(buf, 0, 128);
  memset(buf2, 0, 128);
  //sscanf("bCDE123456abcdedfBCDEF", "%[a-z]%*[A-Z]%[^A-Z]", buf, buf2);
  sscanf("bCDE123456abcdedfBCDEF", "%*[A-Za-z]%[^A-Z]", buf, buf2);
  printf("result1041= %s , %s\n", buf, buf2);
 
  memset(buf, 0, 128);
  sscanf("", "%*[^/]/%[^@]", buf);
  printf("result105= %s\n", buf);
 
  memset(buf, 0, 128);
  sscanf("hello,new world", "%*s%s", buf);
  printf("result106= %s\n", buf);
 
  // String of characters. This will read subsequent characters until a whitespace is found
  // (whitespace characters are considered to be blank, newline and tab).
  memset(buf, 0, 128);
  sscanf("hello, new world", "%*s%s", buf);
  printf("result1061= %s\n", buf);
 
  sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
  printf("result107= %s , %s\n", sztime1, sztime2);
 
 memset(sztime1, 0, 16); 
 memset(sztime2, 0, 16); 
  sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);
  printf("result1071= %s , %s\n", sztime1, sztime2);
  return 0;
}

以上测试结果显示为:

$ sscanTest.exe
result100= Rudolph -> 12 -> years
result101= 123
result102= 123456
result103= WWQcdedfBCDEF
result1031= 123456ab
result104= C, abcdedfBCDEF
result1041= 123456abcdedf ,
result105= 12DDabc/WDFF
result106= world
result1061= new
result107= 2006:03:18 , 2006:04:18
result1071= 2006:03:18 , 2006:04:18

参考网址对const char* s = ; sscanf( s, "%*[^/]/%[^@]", buf );
 的匹配说明,个人感觉说明不太明确(也许是个人的理解不到位吧)
以至我写了上面的练习来体会sscanf表达式的用法
以下是个人理解,有不清楚或错误的地方可指正:
此表达式:"%*[^/]/%[^@]" 它分为两部分,1。需要过滤的部分(也就是去掉部分),2。需要保留给返回值部分
如何确定表达式拆分成几部分,则由%来确定
%*[^/]/为过滤部分, %*[^/]只是过滤了"iios",再加上/,就过滤了"iios/"(参考(*)说明)
%[^@]为返回值部分, 表示匹配到不是@字符为止的字符串,由于它是按char一个一个来匹配,一旦中止条件成立,就不再继续往下进行,也就是贪婪匹配结束

有关表达式可参考perl的,虽然sscanf的匹配模式没有正则表达式那么强大,但在一些场所还是很有效的
阅读(2782) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~