鱼C论坛

 找回密码
 立即注册
查看: 1816|回复: 0

[技术交流] scanf函数进阶应用

[复制链接]
发表于 2020-1-27 10:37:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
       在比赛中我们会遇到一些表达式比如"a + b ="(a,b为字符数组)假如采用字符串保存,然后处理掉无用的字符,当数据量很大时,很可能会超时,我们可以这样写scanf("%s + %s =",a,b);处理,scanf函数可以忽略多个空格,例如:"13456 + 46789 ="和 "1246      +               456789 ="效果是一样的。
       如何跳过一些数据呢?假如输入为:123 466 789三个字符串,我们要舍弃中间的456应该怎么办?可以这样做scanf("%s%*s%s",a,b);(a,b为字符串数组), 星号(*)表示读取但忽略。

标准输入输出函数%[]和%n说明符的使用方法
      scanf fscanf,均从第一个非空格的可显示字符开始读起!
      标准输入输出函数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'字符外)。


       至此,我们可以方便地读取一整行带空格的字符串,例如:
       scanf("%[^\n]", ptr);

注意:

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




转载于:https://blog.51cto.com/9237329/1651066

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 08:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表