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

   标准输入输出函数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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据输入输出函数是用来处理输入输出函数。在C语言中,常用的数据输入输出函数包括printf()、scanf()、fgets()、fputs()等。 1. printf() printf()函数输出格式化字符串。它的一般格式为: printf("格式化字符串", 值1, 值2, ...); 其中,格式化字符串是以%开始的占位符,表示输出的格式,值1、值2等是需要输出的值。例如: int a = 10; printf("a的值是%d\n", a); 这个例子中,%d表示输出整数,输出结果是: a的值是10 2. scanf() scanf()函数用于标准输入流(键盘)中读取数据。它的一般格式为: scanf("格式化字符串", &变量1, &变量2, ...); 其中,格式化字符串和printf()函数类似,用占位符表示输入的格式,&变量1、&变量2等表示需要存储输入值的变量的地址。例如: int a; scanf("%d", &a); printf("a的值是%d\n", a); 这个例子中,%d表示输入整数,&a表示存储输入值的变量a的地址。 3. fgets() fgets()函数用于从文件流中读取一行数据。它的一般格式为: fgets(字符串, 长度, 文件指针); 其中,字符串是存储读取数据的缓冲区,长度是缓冲区的大小,文件指针是要读取的文件。例如: char str[100]; FILE *fp = fopen("test.txt", "r"); fgets(str, 100, fp); printf("读取到的字符串是%s\n", str); 这个例子中,str是存储读取数据的缓冲区,100是缓冲区的大小,fp是要读取的文件,读取结果存储在str中。 4. fputs() fputs()函数用于向文件流中写入一行数据。它的一般格式为: fputs(字符串, 文件指针); 其中,字符串是要写入的数据,文件指针是要写入的文件。例如: FILE *fp = fopen("test.txt", "w"); fputs("Hello World!\n", fp); fclose(fp); 这个例子中,"Hello World!\n"是要写入的数据,fp是要写入的文件。 数据输入输出函数的特点: 1. 数据输入输出函数是C语言中常用的函数之一,可以方便地进行输入输出操作。 2. 数据输入输出函数可以对不同类型的数据进行输入输出操作,例如整数、浮点数、字符等。 3. 数据输入输出函数具有格式化输出功能,可以输出不同格式的数据。 4. 数据输入输出函数可以与文件流结合使用,实现文件的读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值