%*[] 和 %[] 和 %*c 和 %n各自的运用!!!

在学习标c 的时候,突然老师讲解了这四个格式控制符,现在回想起来我都有一点忘了,今天进行一下复习:




首先是%[] :

这个格式控制符存在与scanf函数中,意思就是输入一串字符,但并不是随意的输入,是有限制的,[]中就是限制。


例如

%[a-z] : 就表示只能输入a-z 之间的字母(包括a和z)。这只是其中的一种写法,%[z-a]  %[abcd....xyz] 这都是可以的




扩展 : 虽然这个格式控制符已经理解了,但是我还是想告诉这个格式控制符的另一个用法。

%[^] 这个就是在原来的基础上多加了一个^,但是意义就不一样了,他表示非的意思,

%[^a-z] : 如果输入的是除了a-z之外的字符就放入这个字符串中,如果不是就不用了。(这里的用不着就是把他们还是留在输入缓冲区中,而且如果没有特殊手段,或者在找一个变量,把他们取走,他们就会一直在缓冲区中)






接着%*[]:

有了前面的%[] 作为基础,我想这个格式控制符,说起来就不太那么难理解了,这个控制符和上一个控制符

区别就是在与一个星号‘*’,但是这个星号‘*’,他两个的功能就想差很多了。


%*[] : 也是输入一串字符,但是这个字符存储的位置不用你来申请,而是电脑自己来申请,他不进入输入缓冲区,

可以形象的把他理解为,一个黑洞,但是这个黑洞还是有限制条件的,限制条件就放在[] 中,如果符合条件就把这个字符放入这个黑洞,如果不符合就不放入。(如果没有放入这个黑洞,他就会放入输入缓冲区,如果缓冲区中没有变量取走这个这写字符,他们就一直在缓冲区中)


如何清理输入/输出缓冲区呢 ?

答:fflush(stdout),fflush(stdin) 头文件就是stdio.h


有些人就是不想用这个函数,认为这个函数不好记,那该如何清除一个输入缓冲区。

答 : scanf("%*[^\n]"); scanf("%*c");


这个其实并不是清除一个输入缓冲区,他真正的意义就是在输入缓冲区中跳过一行,从而达到清空的作用

scanf("%*[^\n]"); 这个是读入除了\n 之外的所有字符,遇到\n 结束读入

scanf("%*c"); 这个是读入一个字符,主要是把\n 读入。


解释 : 在输入一个字符串的时候是不是在最后要按一下回车(\n) ,在计算机中它会把\n包括在内,都读入缓冲区中

如果你想在缓冲区中清空他们,你就要先把 \n 之前的全部都取走,但是最后一个\n 还是留在缓冲区中,如果不去管这个\n,在下一次输入的时候,scanf 一开始就会读入\n ,你输入的字符串或者是其他的东西就会读入不进去,因为scanf函数遇到\n 或者是 空格他就会结束读入,这样的话,你的数据就会丢失,所以清除掉\n 是非常关键的一件事情

scanf ("%*c"); 这好就能解决这个问题,但是还是有人会想,为什么不使用scanf("%*[\n]");这个语句呢,这个语句不是很方便么?


在这里我要说明一下,这两个操作是有区别的,

scanf("%*c"):是读取一个字符后就自动结束了。

scanf("%*[\n]"):是读取直到不是\n时才结束。


所以这两个操作是不一样的,后者比前者在理论上慢一点,如果我只是输入abcd\n 这串字符,使用第一种方法

是完全可以的,但是第二种方法,必须等到下一次输入不是\n了,他才结束,这种操作如果换成只进行一次的

第二种方法就会在那里等待,不会进行下一步。




%*c :

这个格式控制符,在上面已经说明了,只取走一个字符,这个字符无论是什么。(在这里就不做过多的叙述了)



%n :

这个格式控制符是,在printf 和 scanf 两个标准输入输出流中都存在的,也就是说上面的都只能在scanf 中使用,但是这个可以在他们两个中使用,而且功能都是一样的

将 目前 已经 输出/输入的 字符数目 存储在``int *''(或变量) 指针参数 指向的 地址. 不转换 任何参数.

这是man 手册中的原话,一定都没有错误,但是光看这句话就可能不理解是什么意思,还是让代码来告诉你吧!


妈妈再也不用担心我不会求字符串的长度了。















  • 7
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值