标准输入输出函数%[]和%n说明符的使用方法

转载 2006年05月22日 22:49:00

        标准输入输出函数scanf具有相对较多的转换说明符,它常常作为入门级函数出现在各种教材中。但奇怪的是,[]和n这两种都为c89/c99所规定的标准说明符却鲜少在大多数教材中出现。虽然[]和n说明符的使用频率不及其它说明符,但两者在程序设计中的作用仍然不可小视,尤其是[]说明符。

        众所周之,scanf以空白字符为定界符,但如果输入的字符串是以其它字符为定界符的,那怎么办?[]就是专门处理这个问题的转换说明符。[]转换说明符可以通过两种方式产生结果字符集,如果第一个[字符右边没有抑扬符(^),那么处于[]之间的字符就是结果字符集,不在其中的可输入字符都作为定界符;如果左边[符号紧靠一个抑扬符(^),那么意义相反,^和]之间的字符是定界符,其余可输入字符是结果字符集。

        在使用[]说明符之前,得先明白两个概念:一是扫描列表。扫描列表(scanlist)指的是包含在[和]两个字符之间除紧靠左边[字符的抑扬符之外的字符,例如:

scanf("%[abcd]", ptr);

abcd组成扫描列表。二是扫描字符集(scanset)。扫描字符集指的是结果字符集,例如上面的例子,结果字符集就是abcd。如果输入一个字符串“cbadkjf”,那么ptr得到的字符串是cbad,kjf三个字符都属于定界符,输入到k字符时输入字符串被截断,kjf三个字符被留在stdin里面。如果带有抑扬符,例如:

scanf("%[^abcd]", ptr);

扫描列表仍然是abcd,但扫描字符集是除abcd外的可输入字符。如果输入字符串“jksferakjjdf”,ptr得到的字符串是“jksfer”。如果想限制输入字符串的字符数量,可以象s说明符那样,在[]前面使用位域,例如:

scanf("%10[^abcd]", ptr);

这样结果字符串最多只能包含10个字符(除'/0'字符外)。

        [符号可以作为扫描列表中的一个成员,但]字符除紧贴最左边的[字符或抑扬符两种情况外,其余情况下都不会被看作扫描列表的成员。例如“%[]abcd]”或者“%[^]abcd]”,上述两种情况下]字符属于扫描列表的成员,但如果是“%[ab]cd]”,中间的]字符不会被看作扫描列表的成员,而且输入输出的结果会是乱七八糟的。

        对于减号-,只有在紧贴[字符或抑扬字符以及作为扫描列表最后一个成员时,-字符才会被视为扫描列表的成员。c标准把其余情况规定为编译器相关的。大多数编译器把这种情况的减号定义为连字符,例如:

scanf("%[a-zA-Z]", ptr);

那么扫描列表由大小写各26个字母组成。少数编译器仍旧把这种情况下的减号视为扫描列表成员。

        %n说明符输出有效字符数量,%n在scanf和printf中都可使用。与%n相对应的形参是一个int类型的指针,%n不影响scanf和printf的返回值。例如:

scanf("%d %d%n", &i, &j, &k);

如果输入434 6434,则k等于8,而scanf的返回值仍然为2。又如:

scanf("%c%n", &ch, &k);

输入“sbcdefdg”后,k等于1,而不是8,因为%c只取一个字符,%n输出的是有效字符数量。

        %n用在printf函数里,表示输出的字符数量,例如:

printf("i=%d, j=%d/n%n", i, j, &k);

在i=343、j=123的情况下,k=12,同时%n不影响printf的返回值,其返回值仍然为12,而不是14。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=514260

相关文章推荐

C++ 标准输入输出 函数 fopen fread等系列函数使用总结

函数原型:FILE * fopen(const char * path,const char * mode); 返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,...

标准输入输出函数

一、格式化输入输出函数        Turbo C2.0 标准库提供了两个控制台格式化输入、 输出函数printf( ) 和scanf(), 这两个函数可以在标准输入输出设备上以各种不同的...

输入、输出函数说明以及精度说明符的使用方法

一、

Windows平台下erlang的port进程关闭标准输入输出的方法

转载:http://arksea.iteye.com/blog/700032   为了避免与port进程的通信受一些printf调试信息的影响,通常都要关闭或者替换标准输入输出。  Un...

第十一章 字符串和字符串函数(字符串标准输入输出库函数)总结 140525

gets ()函数:
  • ghskdq1
  • ghskdq1
  • 2014年05月26日 01:14
  • 268

《C和指针》读书笔记--标准输入输出函数和基础的字符串操纵函数

时隔三年又重新拾起C语言书学习它,说起来很汗颜。这算是一种补窟窿的行为,但是这次补就一定要补好,加油~ 读了这本书的第一章学习了C语言的标准输入输出函数,下面进行以下总结: 一、gets(...

20141204-关于使用C++标准输入输出库:iostream的一点思考

转载请注明出处~   iostream(In and Out stream)是C++语言中标准库(standard library)中提供IO机制的函数库,包含两个基础类型istream和ostrea...

输入输出原理与C语言标准输入输出函数

#include Sleep(1);沉睡一秒       输入输出原理: 输入:当键盘按下按键之后程序读取到数据        流程 1、键盘缓冲区:键盘的内部有一块微处理器,它控制...

C++标准输入输出流

  • 2012年12月16日 23:31
  • 41KB
  • 下载

c标准输入输出

  • 2014年06月16日 18:22
  • 33KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:标准输入输出函数%[]和%n说明符的使用方法
举报原因:
原因补充:

(最多只允许输入30个字)