格式化输入(scanf)输出(printf)函数

时间:2021-03-14 19:54:17

格式化输出函数printf与格式化输入函数scanf是我们经常需要使用的函数,用来输出和输入的。
下面的例子,用来实现从键盘获取不同类型的数据并输出。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i;
int j = 0;

int num;
char ch;
long l_num;
float f_num;
double d_num;
char *src;
char ptr[100];
int a[3];

printf("input a num:");
scanf("%d", &num);
printf("num = %d\n",num);

printf("input a char1:");
scanf("%c", &ch);
printf("ch = %c\n", ch);

printf("input a char2:");
getchar();
putchar(ch);

printf("input a long :");
scanf("%ld", &l_num);
printf("l_num = %ld\n", l_num);

printf("input a float:");
scanf("%f", &f_num);
printf("f_num = %f\n", f_num);

printf("input a double:");
scanf("%lf", &d_num);
printf("d_num = %lf\n", d_num);

src = ( char *) malloc ( sizeof ( char *));
printf("input a str:");
scanf("%c", src);
printf("src = %c\n", *src);

printf("input a ptr1:");
scanf("%s", ptr);
printf("ptr1 = %s\n", ptr);

printf("input a ptr2:");
while( ptr[j] != '\0')
{
scanf("%c", &ptr[j]);
j++;
}

printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:

  • 缓冲区填满
  • 写入的字符中有‘\n’’\r’
  • 调用fflush手动刷新缓冲区
  • 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新

满足上面4个条件之一缓冲区就会刷新,也就是printf会真正调用write来写入。

printf函数的使用技巧
颜色代码:
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函数在输入数据时,遇到以下情况认为该情况结束:

  • 遇到空格,TAB,或回车
  • 与宽度结束
  • 与非法输入

scanf函数有可能会留下一些“垃圾”数据,我们可以用以下的方法来解决:

  • 用getchar()清除
  • 用格式串中空格或“%*c”来吃掉