1 printf()函数

最末一个字母f即为“格式”(format)。
printf("格式控制字符串",表达式1,表达式2,...,表达式n);

  • 格式控制字符串包括
  1. 常规字符:包括可显示字符和用转义字符表示的字符。
  2. 格式控制符:以 % 开头的一个或多个字符,如 %d% 后面的是格式转换字符

tip:想要显示 **%** ,必须在格式控制字符串中用 **%%** 来替代单个 **%**

  • 使用printf函数要注意以下几点:
  1. 格式控制字符串可以不包含任何格式控制符。
    1. printf("how are you?\n");
    2. printf("how old are you?\n",20); //带有参数20,但无意义也可。
  2. 如果格式控制字符串中格式控制符的个数多于表达式的个数,则余下的格式控制符的值将是不确定的。当然,如果少于表达式的个数,则不影响输出。

例如,printf("5+3=%d,5-3=%d,5*3=%d",5+3,5-3);
输出结果: 5+3=8,5-3=2,5*3=-28710 。此处的-28710就是随机的。

  1. 输出时表达式值的计算顺序是从右到左。

例如, int i=1;printf("%d,%d,%d\n",i,i+1,i=3);
输出结果: 3,4,3

格式转换符 含义 对应的表达式数据类型
%d或%i 以十进制输出整型 有符号整型
%x、%X 以十六进制输出无符号整型
int a=164;
printf("%x",a); //输出a4
printf("%X",a); //输出A4
无符号整型
这里的无符号即,将待输出数直接进行除法转换为对应进制,无需进行反码转换
%o 以八进制输出无符号整型 无符号整型
%u 以十进制输出无符号整型 无符号整型
%c 输出一个字符型 字符型
%s 输出一个字符串 字符串
%f 以十进制小数形式输出一个浮点型数据 浮点型
%e、%E 以指数形式输出一个浮点型数据
float f=1234.8998;
printf("%e",f); //输出1.234900e+003
printf("%E",f); //输出1.234900E+003
浮点型
%g、%G 按照%f或%e中输出宽度比较短的一种格式输出 浮点型
%p 以主机的格式显示指针 指针类型
  • 可以在格式转换字符和 % 之间插入一些辅助的格式控制字符。

%[flag][width][.precision][size]Type

  1. 表示可以缺省
  2. width和precision都必须是无符号的整数。presion前的 . 不能省略。
  3. Type就是上表列出的格式转换符
  • printf中辅助格式控制字符 | 修饰符 | 功能 | 例子 | | —- | —- | —- | | width | 输出数据域宽,当数据长度<width时,补空格,否则按数位输出 | %4d表示输出至少占4格 | | .precision | 对于整数,表示至少要输出precision位。数据长度小于precision时,左边补0 | | | | 对于实数,指定小数点后的位数 | | | | 对于字符串,表示只输出字符串的前precision个字符 | | | - | 输出数据左对齐(默认右对齐) | | | + | 输出有符号正数时,在前面显示+ | | | 0 | 输出数值时指定左边需要补位时自动填0 | | | # | 对于无符号数,在八进制和十六进制数前显示前导0,0x或0X | | | | 对于实数,必须输出小数点 | | | h | 在d/o/x/u前,指定输出为短整型数(short) | | | l | 在d/o/x/u前,指定输出为long int型 | | | | 在e/f/g前,指定输出精度为double型(默认时也为double) | | | L | 在e/f/g前,指定输出精度为long double型 | |

2 scanf函数

scanf("格式控制字符串",变量1的地址,变量2的地址,...,变量n的地址);
例如,
int a;
scanf("%d",&a);
& 符号的功能是取变量的地址,因此称为取地址运算符。它与++,sizeof等运算符具有相同的优先级。

  • &只能作用于变量,不能作用于表达式。如 &(a+1) 是错误的。

2.1 scanf函数的格式控制符的一般形式

%[*][width] [l|h]Type

  • :表示可选项,可省略。
  • |:表示互斥关系
  • width:指定输入数据的域宽,遇到空格或不可转换字符则结束。
  • *:翼支付,输入的数据不会赋值给相应的变量。
  • l:long
  • h:short

需注意:

  1. 相邻两个格式控制符之间,不指定数据分隔符(如逗号、冒号等),则输入时至少用一个空格分割,或者用Tab键分隔,或输入一个数据后,回车再输入下一个。
  2. 格式控制字符串中的转义字符,如 \n ,系统不会将其当做转义字符来解释,而是视其为普通字符,所以需原样输入

int`` ``num1``,``num2``;
scanf``(``"num1=``%d``,num2=``%d``\n``"``,``&``num1``,``&``num2``);
printf``(``"``%d`` ``%d``"``,``num1``,``num2``);
只有输入 num1=12,num2=36\n 才会正常输出 12 36

  1. 当格式控制字符串中指定了输入数据的域宽width时,将读取输入数据中相应的width位,但按需要的位数赋给相应的变量,多余部分被舍弃,例如

scanf("%3c%3c",&ch1,&ch2);
输入 abcdefg ,则将 abc 中的a赋值给ch1,将 def 中的d赋值给ch2.

  1. 当格式控制字符串含有抑制符“*”时,表示本输入项对应的数据读入后,不赋给相应的变量(该变量由下一个格式指示符输入)。例如

scanf("%2d%*2d%3d",&num1,&num2);
printf("num1=%d,num2=%d\n",num1,num2);
假设输入123456789,则系统将读取12赋值给num1,读取34但舍弃掉,读取567并赋值给num2。

  1. 输入数据时,遇到一下情况,系统认为输入结束:
  • 遇到空格、回车或Tab
  • 遇到输入域宽度结束。例如“%3d”,只取3列。
  • 遇到非法输入。

在输入数据类型和字符类型的两个scanf函数调用之间通常要使用 fflush 库函数以清楚键盘缓冲区中的字符。

因为scanf函数首先将用户输入的文本存放在内部的缓冲区,如果在连续输入时,下一项输入为字符型,那么不进行fflush清楚缓存时,将会把上一项输入结束时的 回车 读入字符型变量。

3 字符数据的非格式化输入输出

3.1 字符数据的非格式化输入

3.1.1 getchar()

int getchar(void);

  • 所处头文件:stdio.h
  • 读取用户的按键信息,返回值为按键的ASCII码
  • 在调用getchar之前,输入了多个字符(这些字符将会被保存在缓冲区中),则getchar将会从缓冲区中读取输入的第一个字符;而剩余的字符将会继续保存在缓冲区中,等待后来的getchar获取。这意味着后续的getchar不会等待用户按键输入。

    3.1.2 getc()

    int getc(FILE *stream);
  • 从流文件stream中读取一个字符信息,它的返回值是所读取字符的ASCII码
  • 当流文件是stdin时,getc和getchar完全相同

    3.1.3 getche()和getch()

    • 所处头文件:conio.h
    • 直接从键盘获取值,不等待用户按下回车。
    • 两者的差别是,getche()会在页面上立刻显示读取的字符,而getch()不会。
    • 由于getch()的特性,常用于调试程序,达到使程序暂停的效果,继而按下任意键继续。

3.2 字符数据的非格式化输出

3.2.1 putchar()

  • 格式:int putchar(int c);
  • 输出c所表示的字符
  • c为要显示的字符的ASCII码值
  • 返回值:若正常,返回对应字符的ASCII码值;若出错,则返回 EOF (-1)

    3.2.2 putc()

    int purc(int c, FILE *stream);
  • 将形参c所表示的字符输出到流文件stream
  • 如果流文件为stdout,则putc与putchar功能完全相同

    3.2.3 puts()

    • 格式: int puts(char *string);
    • 将形参string所代表的字符串输出,并自动回车换行