您的位置:首页 > 编程语言 > C语言/C++

printf 和 scanf 的使用

2016-07-14 15:41 218 查看
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个字符。

一个在努力中的未来程序员,如果有更好的想法,欢迎评论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 printf scanf