1 #include <iostream> // for std::cout
2 #include <utility> // for std::pair
3 #include <algorithm> // for std::for_each
4 #include <vector>
5 using namespace std;
6
7 #include <string.h>
8
9 int main()
10 {
11 char temp[100] = "/a/b/c/d/e";
12 char file[100];
13 sscanf(temp,"/%*[^/]/%*[^/]/%*[^/]/%[^/]",file);
14 cout << file << endl;
15 return 0;
16 }

匹配中其中的d

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

 

  sscanf("123456 abcdedf", "%[^ ]", buf);

 

  printf("%s\n", buf);

 

  结果为:123456

 

摘自百度百科  http://baike.baidu.com/view/1364018.html

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。

 

  sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.

 

  //-------------------------------------------------------

 

  用它来分隔类似这样的字符串2006:03:18:

 

  int a, b, c;

 

  /*sscanf("2006:03:18", "%d:%d:%d", a, b, c); */ /*错误方法, 要在变量a,b,c前加上取地址符, modified by huanmie_09*/

 

  sscanf("2006:03:18", "%d:%d:%d", &a, &b, &c);

 

  以及2006:03:18 - 2006:04:18:

 

  char sztime1[16] = "", sztime2[16] = "";

 

  sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

 

  但是后来,我需要处理2006:03:18-2006:04:18

 

  仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。

 

  我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。

 

  format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。

 

  %[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。

 

  所以那个问题也就迎刃而解了:

 

  sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

 

  在softmse (Jake) 的问题贴http://community.csd(去掉我)n.n(去掉我)et/Expert/topic/4843/4843294.xml?temp=.4321558中 ,给出了一个很cool的sscanf用例,而后通过学习,发现sscanf真棒,现做一总结。

 

  原问题:

 

  iios/12DDWDFF@122

 

  获取/和@之间的字符串怎么做

 

  C程序里面有什么函数吗?

 

  代码:

 

  #include <stdio.h>

 

  int main()

 

  {

 

  const char* s = "iios/12DDWDFF@122";

 

  char buf[20];

 

  sscanf( s, "%*[^/]/%[^@]", buf );

 

  printf( "%s\n", buf );

 

  return 0;

 

  }

 

  结果为:12DDWDFF

posted on 2011-11-30 16:54  吃吃户  阅读(334)  评论(0编辑  收藏  举报