今天在看同事的代码时赶上下面一行代码:html
<!-- lang: cpp --> fscanf(pfile, "WEBSPORT=\"%[^\"]\n", webport);
代码的做用很简单,只是函数中的格式控制符我忽然有点感受陌生了,从学校出来后,就比较少用到scanf函数,所以对它的格式控制符也就渐渐地陌生。既然陌生,就必需要从新熟悉才行,因而上网查找了一下,完全地弄明白上面的含义,从新熟悉了一下scanf函数的格式控制符。在此备忘我的以为比较容易忘记的一些格式控制符。web
<!-- lang: cpp --> "% * 域宽 l/h d/o/x/c/s/f/e" //无%u格式、%g格式
说明:函数
%后的“*” 附加说明符,用来表示跳过它相应的数据指针
根据格式字符的含义从输入流中取得数据,当输入流中数据类型与格式字符要求不符时,就认为这一项结束code
隐示分隔符:空格、制表符('\t')、换行符('\n')都是C语言认定的数据分隔符htm
显示分隔符。在scanf函数的两个格式说明项间有一个或多个普通字符,那么在输入数据时,在两个数据之间也必须以这一个或多个字符分隔。如语句:blog
<!-- lang: cpp --> scanf("a=%d,b=%f,c=%f", &a, &b, &c); //输入数据应该为:a=1234,b=67.8,c=98.123
使用 %s 格式符是能够的,可是%s遇到空白字符(空格、制表符、\r、\n)就结束字符串
使用 %[...] 格式模式进行字符串输入的匹配控制,经过示例进行说明:get
<!-- lang: cpp --> const char *p="12232114687adeABC12356"; scanf("%[123]%[46-8]%[a-zA-Z]%[1-6]", buf1,buf2,buf3,buf4); //上面语句的结果将为:buf1="1223211",buf2="4687" //buf3="adeABC",buf4="12356"
%[pattern]表示从输入源读取字符到变量中,直到读取到的某个字符不属于pattern模式中的字符中止,pattern中的字符不区分前后顺序,以单个字符做为基本单元;pattern支持范围表示,如只读取数字,可使用%[0-9],只读取字母,使用%[a-zA-Z];若是pattern中的第一个字母是"^",则表示对^符号以后的pattern取反,如%[^A-Za-z]的意思就是取字母以外的全部字符。变量
使用 %[^\n]%*c 读取一行字符,不能使用%s进行读取,表示读到\n为止,%*c的做用就是把\n去掉,不然再次读的时候一直遇到的都是\n。
全部对%s起做用的控制,均可以用于%[],好比"%*[^\n]%*c"就表示跳过一行,"%-20[^\n]"就表示读取\n前20个字符。
如今再来看文章开头的那行代码就清楚了:"%[^"]\n,"将双引号进行转义为普通字符,%[^"]表示读取到下一个双引号结束,\n表示在输入源中有一个换行符。实际的文件输入源内容为:
<!-- lang: cpp --> WEBSPORT="80"
文章参考:http://www.cnblogs.com/huzhongzhong/archive/2011/07/15/2107216.html
补充: