printf 和 scanf 的使用

printf和scanf常常被使用,我也查阅写资料了解了部分printf和scanf的使用。要是有新发现继续更新。

要了解printf,首先要知道printf是一个行缓冲,也就是满一行输出,只有两种情况不满一行也输出,一是程序结束时,清理缓冲区。二是后面有scanf输入,在输入前会先清理缓冲区。(因为scanf和printf使用一个缓冲区)


常规使用可以看这个,感觉写的蛮清楚点:

http://blog.csdn.net/xfortius/article/details/7901829


printf还可以调整字体颜色和光标所在位置(可以使用这个用C语言做界面)。


printf("\033[字体背景颜色;字体颜色m字符串\033[0m");

printf("\033[47;31mhello world\033[5m");


47是字背景颜色, 31是字体的颜色, hello world是字符串. 后面的\033[5m是控制码


.颜色代码:

QUOTE:

字背景颜色范围: 40--49                                  字颜色: 30--39 

                             40: 黑                                          30: 黑 
                             41: 红                                          31: 红 
                             42: 绿                                          32: 绿 
                             43: 黄                                          33: 黄 
                             44: 蓝                                          34: 蓝 
                             45: 紫                                          35: 紫 
                             46: 深绿                                      36: 深绿 

                             47: 白色                                      37: 白色


ANSI控制码:

QUOTE:

 

\033[0m 关闭所有属性 
\033[1m 设置高亮度 
\03[4m 下划线 
\033[5m 闪烁 
\033[7m 反显 
\033[8m 消隐 
\033[30m -- \033[37m 设置前景色 
\033[40m -- \033[47m 设置背景色 
\033[nA 光标上移n行 
\03[nB 光标下移n行 
\033[nC 光标右移n行 
\033[nD 光标左移n行 
\033[y;xH设置光标位置 
\033[2J 清屏 
\033[K 清除从光标到行尾的内容 
\033[s 保存光标位置 
\033[u 恢复光标位置 
\033[?25l 隐藏光标 
\33[?25h 显示光标这样, 在某些时候就可以实现动态的输出.


scanf格式化输出。这点很重要,就是我们必须按照这个格式输入。

在scanf函数的两个格式说明项间有一个或多个普通字符,那么在输入数据时,在两个数据之间也必须以这一个或多个字符分隔。

如语句:
scanf(“a=%d,b=%f,c=%f”,&a,&b,&c);
则输入数据应该为:
   a=1234,b=67.8,c=98.123


scanf格式控制的完整格式:
%    *    m    l或h    格式字符


1  格式字符与printf函数中的使用方式相同,以%d、%o、%x、%c、%s、%f、%e,无%u格式、%g格式。


2  scanf  中不使用U说明符.对unsigned型数据用d、o、x说明符输入.


3  可以指定输入数据所占列宽,系统自动按它截取所需数据。

如:
scanf(“%3d%3d”,&a,&b);
输入:123456
系统自动将123赋给a,456赋给b。


4  
%后的“*”附加说明符,用来表示跳过它相应的数据。

例如:
scanf(“%2d%*3d%2d”,&a,&b);
如果输入如下信息:1234567。将12赋给a,67赋给b。第二个数据”345”被跳过不赋给任何变量。


5  输入数据时不能规定精度,例如:
scanf(“%7.2f”,&a);
是不合法的,不能企图输入:12345.67而使a的值为12345.67。


*********************************************************分割线*******************************************


下面这个说的比较乱,但清楚的。


对于 const char* p = "12232114687ABC12356";
scanf(p,"%[123]",buf); // 就把是'1'或'2'或'3'的字读读到buf中,直到遇到一个不是'1'且不是'2'且不是'3'的字符,于是执行后buf应该是"1223211";
%[123]等同于%[231],等同于%[321]……,列表中的顺序是无所谓的;
%[123]也等同于%[1-3]或%[3-1],也就是“1至3”,对于连续的字符列表这样写就很简单,比如%[a-z]等同%[abc…省略…z];
想想看,%[3-14]应该等同于什么?是“3至14”吗?当然不是,因为[]中的是字符,而不是数字,所以%[3-14]应该等同于%[3214],等同于%[1234];
同理,想只取字母,那就可以写成%[A-Za-z];
如果列表的第一个字母是^,那么正好相反,比如%[^A-Za-z]的意思就是取字母之外的所有字符。
对于字符串"abDEc123"如果想按照字母和数字读到两个字符串中就应该是 "%[a-zA-Z]%[0-9]",buf1,buf2 ;
假如我想取一行字符,该怎么办?"%s"是不行的,因为%s遇到空白字符(空格、制表符、\r、\n)就结束了,所以可以写成 "%[^\n]%*c",%[^\n]的作用刚才讲过了,就是读\n之外的所有字符,也就是说读到\n为止,%*c的作用就是把\n去掉,否则再次读的时候一直遇到的都是\n;
所有对%s起作用的控制,都可以用于%[],比如"%*[^\n]%*c"就表示跳过一行,"%-20[^\n]"就表示读取\n前20个字符。


一个在努力中的未来程序员,如果有更好的想法,欢迎评论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值