在学习标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 手册中的原话,一定都没有错误,但是光看这句话就可能不理解是什么意思,还是让代码来告诉你吧!
妈妈再也不用担心我不会求字符串的长度了。