﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-极品垃圾-文章分类-每天的学习所得</title><link>http://www.cppblog.com/bestcln/category/8778.html</link><description>初学VC ,就是把每天所看到的整理到博客，慢慢消化这些内容。见证我的学习之路吧。很多都是转载。</description><language>zh-cn</language><lastBuildDate>Mon, 11 May 2009 20:03:18 GMT</lastBuildDate><pubDate>Mon, 11 May 2009 20:03:18 GMT</pubDate><ttl>60</ttl><item><title>老板的要求</title><link>http://www.cppblog.com/bestcln/articles/82622.html</link><dc:creator>极品垃圾</dc:creator><author>极品垃圾</author><pubDate>Mon, 11 May 2009 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/bestcln/articles/82622.html</guid><wfw:comment>http://www.cppblog.com/bestcln/comments/82622.html</wfw:comment><comments>http://www.cppblog.com/bestcln/articles/82622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bestcln/comments/commentRss/82622.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bestcln/services/trackbacks/82622.html</trackback:ping><description><![CDATA[晚上，华老师要求这样做实验。做实验前，要写实验目的，实验方案。记录实验数据，对数据分析，并有实验结论。每天都要有目的做事情，要有预期和总结。
<img src ="http://www.cppblog.com/bestcln/aggbug/82622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bestcln/" target="_blank">极品垃圾</a> 2009-05-11 21:39 <a href="http://www.cppblog.com/bestcln/articles/82622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sscanf()的一些使用说明</title><link>http://www.cppblog.com/bestcln/articles/66490.html</link><dc:creator>极品垃圾</dc:creator><author>极品垃圾</author><pubDate>Mon, 10 Nov 2008 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/bestcln/articles/66490.html</guid><wfw:comment>http://www.cppblog.com/bestcln/comments/66490.html</wfw:comment><comments>http://www.cppblog.com/bestcln/articles/66490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/bestcln/comments/commentRss/66490.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/bestcln/services/trackbacks/66490.html</trackback:ping><description><![CDATA[<div>这里有些sscanf()的一些使用说明，都是从论坛，Blog里整理出来的。供大家使用。<br>&nbsp;&nbsp; 通过学习和使用个人认为，在字符串格式不是很复杂，但是也并不简单的时候用这个函数比较合适，这个尺度就要靠自己把握了，字符串不是很复杂，但自己写个处理的函数比较麻烦，效率也不高，就用这个函数，如果字符串很复杂，那就用正则表达式吧。<br>不多说了，看看下面这些介绍和列子吧！</div>
<div>名称:sscanf() - 从一个字符串中读进与指定格式相符的数据.<br>函数原型:<br>Int&nbsp; sscanf( string str, string fmt, mixed var1, mixed var2 ... );<br>int&nbsp; scanf( const char *format [,argument]... );</div>
<div>说明：<br>sscanf与scanf类似，都是用于输入的，只是后者以屏幕(stdin)为输入源，前者以固定字符串为输入源。<br>其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}</div>
<div>支持集合操作：<br>&nbsp;&nbsp;&nbsp;&nbsp; %[a-z] 表示匹配a到z中任意字符，贪婪性(尽可能多的匹配)<br>&nbsp;&nbsp;&nbsp;&nbsp; %[aB'] 匹配a、B、'中一员，贪婪性<br>&nbsp;&nbsp;&nbsp;&nbsp; %[^a] 匹配非a的任意字符，贪婪性</div>
<div>例子：<br>1. 常见用法。<br>&nbsp;&nbsp;&nbsp; char buf[512] = {0};<br>&nbsp;&nbsp;&nbsp; sscanf("123456 ", "%s", buf);<br>&nbsp;&nbsp;&nbsp; printf("%s\n", buf);<br>结果为：123456</div>
<div>2. 取指定长度的字符串。如在下例中，取最大长度为4字节的字符串。<br>&nbsp;&nbsp;&nbsp; sscanf("123456 ", "%4s", buf);<br>&nbsp;&nbsp;&nbsp; printf("%s\n", buf);<br>结果为：1234</div>
<div>3. 取到指定字符为止的字符串。如在下例中，取遇到空格为止字符串。<br>&nbsp;&nbsp;&nbsp; sscanf("123456 abcdedf", "%[^ ]", buf);<br>&nbsp;&nbsp;&nbsp; printf("%s\n", buf);<br>结果为：123456<br>&nbsp;<br>4.&nbsp; 取仅包含指定字符集的字符串。如在下例中，取仅包含1到9和小写字母的字符串。<br>&nbsp;&nbsp;&nbsp; sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);<br>&nbsp;&nbsp;&nbsp; printf("%s\n", buf);<br>结果为：123456abcdedf<br>&nbsp;<br>5.&nbsp; 取到指定字符集为止的字符串。如在下例中，取遇到大写字母为止的字符串。<br>&nbsp;&nbsp;&nbsp; sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);<br>&nbsp;&nbsp;&nbsp; printf("%s\n", buf);<br>结果为：123456abcdedf</div>
<div>6、给定一个字符串<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#105;&#105;&#111;&#115;&#47;&#49;&#50;&#68;&#68;&#87;&#68;&#70;&#70;&#64;&#49;&#50;&#50;"><u><font color=#0000ff>iios/12DDWDFF@122</font></u></a>，获取 / 和 @ 之间的字符串，先将 "iios/"过滤掉，再将非<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#64;&#39;"><u><font color=#0000ff>'@'</font></u></a>的一串内容送到buf中<br>&nbsp;&nbsp;&nbsp; sscanf("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#105;&#105;&#111;&#115;&#47;&#49;&#50;&#68;&#68;&#87;&#68;&#70;&#70;&#64;&#49;&#50;&#50;"><u><font color=#0000ff>iios/12DDWDFF@122</font></u></a>", "%*[^/]/%[^@]", buf);<br>&nbsp;&nbsp;&nbsp; printf("%s\n", buf);<br>结果为：12DDWDFF<br>&nbsp;<br>7、给定一个字符串&#8220;&#8220;hello, world&#8221;，仅保留world。（注意：&#8220;，&#8221;之后有一空格）</div>
<div>&nbsp;&nbsp;&nbsp; sscanf(&#8220;hello, world&#8221;,&nbsp; "%*s%s",&nbsp; buf);&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; printf("%s\n", buf);<br>结果为：world<br>%*s表示第一个匹配到的%s被过滤掉，即hello被过滤了<br>如果没有空格则结果为NULL。<br>8、<br>&nbsp;char *s="1try234delete5"&nbsp; <br>则： <br>sscanf(s, "1%[^2]234%[^5]", s1, s2); <br>scanf的format中出现的非转换字符（%之前或转换字符之后的字符），即此例中的1234用来跳过输入中的相应字符； <br>&#8216;[]&#8217;的含义与正则表达式中相同，表示匹配其中出现的字符序列；^表示相反。使用[ ]时接收输入的变量必须是有足够存储空间的char、signed char、unsigned char数组。记住[也是转换字符，所以没有s了。</div>
<div>8、分割以某字符标记的字符串。</div>
<div>&nbsp;char test[]="222,333,444,,,555,666"; <br>&nbsp;char s1[4],s2[4],s3[4],s4[4],s5[4],s6[4],s7[4]; <br>&nbsp;sscanf(test,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]",s1,s2,s3,s4,s5,s6,s7); <br>&nbsp;printf("sssa1=%s",s1); <br>&nbsp;printf("sssa2=%s",s2); <br>&nbsp;printf("sssa3=%s",s3); <br>&nbsp;printf("sssa4=%s",s4); <br>&nbsp;printf("sssa5=%s",s5); <br>&nbsp;printf("sssa6=%s",s6); <br>&nbsp;printf("sssa7=%s",s7); <br>9、一个提取用户个人资料中邮件地址的例子 <br>#include&lt;cstdlib&gt;<br>#include&lt;cstdio&gt;<br>using namespace std;<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; char a[20]={0};<br>&nbsp;&nbsp;&nbsp; char b[20]={0};<br>&nbsp;&nbsp;&nbsp; //假设email地址信息以';'结束 <br>&nbsp;&nbsp;&nbsp; sscanf("email:jimmywhr@gmail.com;","%*[^:]:%[^;]",a);<br>&nbsp;&nbsp;&nbsp; //假设email地址信息没有特定的结束标志 <br>&nbsp;&nbsp;&nbsp; sscanf("email:jimmywhr@gmail.com","%*[^:]:%s",b);<br>&nbsp;&nbsp;&nbsp; printf("%s\n",a);<br>&nbsp;&nbsp;&nbsp; printf("%s\n",b);<br>&nbsp;&nbsp;&nbsp; system("pause");<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br>&nbsp; 关键是"%*[^:]:%[^;]"和"%*[^:]:%s"这两个参数的问题 <br>&nbsp; %*[^:]&nbsp;&nbsp;&nbsp; 表示满足"[]"里的条件将被过滤掉，不会向目标参数中写入值。这里的意思是在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一个':'之前的字符会在写入时过滤掉,'^'是表示否定的意思，整个参数翻译<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成白话就是：将在遇到第一个':'之前的（不为':'的）字符全部过滤掉。 <br>&nbsp; :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自然就是跳过':'的意思。<br>&nbsp; %[^;]&nbsp;&nbsp;&nbsp;&nbsp; 拷贝字符直到遇到';'。</div>
<div>一下摘自：<a href="http://blog.csdn.net/lbird/archive/2007/08/03/1724429.aspx"><u><font color=#810081>http://blog.csdn.net/lbird/archive/2007/08/03/1724429.aspx</font></u></a><br>%[ ] 的用法：%[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是&#8221;^&#8221;，则表示反意思。</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ ]内的字符串可以是1或更多字符组成。空字符集（%[]）是违反规定的，可</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导致不可预知的结果。%[^]也是违反规定的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div>%[a-z] 读取在 a-z 之间的字符串，如果不在此之前则停止，如</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char s[]="hello, my friend&#8221; ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 注意: ,逗号在不 a-z之间</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sscanf( s, &#8220;%[a-z]&#8221;, string ) ; // string=hello</div>
<div><br>%[^a-z] 读取不在 a-z 之间的字符串，如果碰到a-z之间的字符则停止，如</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char s[]="HELLOkitty&#8221; ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 注意: ,逗号在不 a-z之间</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sscanf( s, &#8220;%[^a-z]&#8221;, string ) ; // string=HELLO</div>
<div><br>%*[^=]&nbsp;&nbsp;&nbsp; 前面带 * 号表示不保存变量。跳过符合条件的字符串。</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char s[]="notepad=1.0.0.1001" ;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char szfilename [32] = "" ;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL,因为没保存</div>
<div>&nbsp;int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001</div>
<div>%40c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读取40个字符</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The run-time</div>
<div>&nbsp;library does not automatically append a null terminator</div>
<div>&nbsp;to the string, nor does reading 40 characters</div>
<div>&nbsp;automatically terminate the scanf() function. Because the</div>
<div>&nbsp;library uses buffered input, you must press the ENTER key</div>
<div>&nbsp;to terminate the string scan. If you press the ENTER before</div>
<div>&nbsp;the scanf() reads 40 characters, it is displayed normally,</div>
<div>&nbsp;and the library continues to prompt for additional input</div>
<div>&nbsp;until it reads 40 characters</div>
<div><br>%[^=]&nbsp;&nbsp;&nbsp;&nbsp; 读取字符串直到碰到&#8217;=&#8217;号，&#8217;^&#8217;后面可以带更多字符,如：</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char s[]="notepad=1.0.0.1001" ;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char szfilename [32] = "" ;</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果参数格式是：%[^=:] ，那么也可以从 notepad:1.0.0.1001读取notepad</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div>使用例子：</div>
<div>&nbsp;char s[]="notepad=1.0.0.1001" ;</div>
<div>&nbsp;char szname [32] = "" ;</div>
<div>&nbsp;char szver [32] = &#8220;&#8221; ;</div>
<div>sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001</div>
<div>总结：%[]有很大的功能，但是并不是很常用到，主要因为：</div>
<div>1、许多系统的 scanf 函数都有漏洞. (典型的就是 TC 在输入浮点型时有时会出错). </div>
<div>2、用法复杂, 容易出错. </div>
<div>3、编译器作语法分析时会很困难, 从而影响目标代码的质量和执行效率.</div>
<div>个人觉得第3点最致命，越复杂的功能往往执行效率越低下。而一些简单的字符串分析我们可以自已处理。</div>
<img src ="http://www.cppblog.com/bestcln/aggbug/66490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/bestcln/" target="_blank">极品垃圾</a> 2008-11-10 10:52 <a href="http://www.cppblog.com/bestcln/articles/66490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>