2015-11-06 68 views
1

如果我想获得之间的子串“/”,“@”,这个一会工夫:使用的sscanf()截断字符串

char buf[512] ="" ; 
char src[512] = "iios/[email protected]"; 

sscanf(src, "%*[^/]/%[^@]", buf); 
printf("%s\n", buf);   //buf will be "12DDWDFF" 

我怎样才能得到同样的结果“//^&# @iios //// 12DDWDFF @@@@ 122/& * @(@ ///“;

char buf2[512] ="" ; 
char src[512] = "//^&#@iios////[email protected]@@@122/&*@(@///"; 

sscanf(src, "%*[4][^/]/%[4][^@]", buf2); 
printf("%s\n", buf2);   //buf2 gets nothing 

sscanf(src, "%*[^////]/////%[^@@@@]", buf2); 
printf("%s\n", buf2);   //buf2 gets nothing 
+3

功能的'scanf'家庭是不是真的适合先进的解析,试图寻找可能合作,寻找例如其他功能''////“'和'”@@@@“'序列以及如何提取数据。 ['strstr'](http://en.cppreference.com/w/c/string/byte/strstr)和['strncpy'](http://en.cppreference.com/w/c/string/byte/strncpy)也许? –

+0

如果开始和结束字符序列是唯一的,那么你可以使用'strstr()'获得指向所需字符串开始/结束的指针。如果开始/结束字符序列不是唯一的,那么提取由可变字符序列分隔的特定子字符串将非常困难。 – user3629249

回答

4

你可以写你sscanf声明如下 -

if(sscanf(src,"%*[^0-9]%[^@]",buf2)==1) 
{ 
    //do something 
} 

%*[^0-9]会读,直到遇到数,然后丢弃它,直到遇到@ 将读入buf2

Demo

+0

谢谢!但是如果src是“// ^&#345 @ Fiios //// 12DDWDFF @@@@ 122 /&* @(@ ///” –

+1

@MinKim如果'src'的格式不是恒定的,那么你应该可能按照Joachim Plieborg的评论。 – ameyCU

+0

谢谢!我做了,它工作完美! –