C语言printf和scanf函数的格式控制符介绍
C语言中非常重要的两个函数,输入函数(scanf,功能是通过键盘给程序中的变量赋值)输出函数(printf,功能是将程序运行的结果输出到屏幕上),如果在程序中要使用 printf 或者 scanf,那么就必须要包含头文件 stdio.h。因为这两个函数就是包含在该头文件中的。
printf函数的用法
printf 的格式
printf 函数的原型为:
# include <stdio.h>
int printf(const char *format, ...);
printf有如下几种用法:
☆printf("字符串\n");
如:
printf("Hello World!\n"); // \n表示换行
☆printf("输出控制符",输出参数);
如
int i = 2;
printf("%d\n", i); /* 输出:2 其中%d是输出控制符,d 表示十进制,后面的 i 是输出参数 */
又如
int i = 2;
int j = 3;
printf("%d %d\n", i, j); /* 输出:2 3 */
☆printf("输出控制符 非输出控制符",输出参数);
int i = 20;
int j = 30;
printf("i = %d, j = %d\n", i, j); /* 输出:20 30 */
输出控制符
常用的输出控制符主要有以下几个:
控制符 |
说明 |
%d |
按十进制整型数据的实际长度输出。 |
%ld |
输出长整型数据。 |
%md |
m 为指定的输出字段的宽度。如果数据的位数小于 m,则左端补以空格,若大于 m,则按实际位数输出。 |
%u |
输出无符号整型(unsigned)。输出无符号整型时也可以用 %d,这时是将无符号转换成有符号数,然后输出。但编程的时候最好不要这么写,因为这样要进行一次转换,使 CPU 多做一次无用功。 |
%c |
用来输出一个字符。 |
%f |
用来输出实数,包括单精度和双精度,以小数形式输出。不指定字段宽度,由系统自动指定,整数部分全部输出,小数部分输出 6 位,超过 6 位的四舍五入。 |
%.mf |
输出实数时小数点后保留 m 位,注意 m 前面有个点。 |
%o |
以八进制整数形式输出,这个就用得很少了,了解一下就行了。 |
%s |
用来输出字符串。用 %s 输出字符串同前面直接输出字符串是一样的。但是此时要先定义字符数组或字符指针存储或指向字符串,这个稍后再讲。 |
%x(或 %X 或 %#x 或 %#X) |
以十六进制形式输出整数,详见【注】。 |
【注】%x、%X、%#x、%#X 的区别
如果是小写的x,输出的字母就是小写的;如果是大写的X,输出的字母就是大写的;如果加一个#,就以标准的十六进制形式输出。例子:
# include <stdio.h>
int main(void)
{
int i = 47;
printf("%x\n", i);
printf("%X\n", i);
printf("%#x\n", i);
printf("%#X\n", i);
return 0;
}
使用Dev-C++ 运行,参见下图:
有关输出对齐的例子,源码如下:
/*有关输出对齐的例子 */
# include <stdio.h>
int main(void)
{
char insertTime[20] = "1234567890";
double insertTime1 = 12321;
printf("|%-15s|\n",insertTime); //左对齐,15位长度,不够补空格
printf("|%15s|\n",insertTime); //右对齐,15位长度,不够补空格
printf("|%015s|\n",insertTime); //右对齐,15位长度,不够补0
printf("|%-15.2f|\n",insertTime1); //左对齐,15位长度,带两位小数,不够补空格
return 0;
}
补充说明:其中-表示左对齐输出,如省略表示右对齐输出;0表示指定空位填0,如省略表示指定空位不填。
使用Dev-C++ 运行,参见下图:
scanf函数的用法
scanf函数的一般形式为:
scanf(“格式控制字符串”, 地址表列);
其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。例如:&a、表示变量a的地址。
需要明确,变量的值和变量的地址这是两个不同的概念。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。
变量的地址和变量值的关系
当给变量赋值,如:
a=567;
则,a为变量名,567是变量a的值,&a是变量a的地址,其中&是一个取地址运算符。
函数scanf()中格式字符串的一般形式为:
%[*][输入数据宽度][长度]类型
其中有方括号[]的项为任选项。各项的意义如下:
1) 类型
表示输入数据的类型,其格式符和意义如下表所示:
格式 |
字符意义 |
d |
输入十进制整数 |
o |
输入八进制整数 |
x |
输入十六进制整数 |
u |
输入无符号十进制整数 |
f或e |
输入实型数(用小数形式或指数形式) |
c |
输入单个字符 |
s |
输入字符串 |
2) “*”符
用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。如:
scanf("%d %*d %d",&a,&b);
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。
3) 宽度
用十进制整数指定输入的宽度(即字符数)。例如:
scanf("%5d",&a);
输入12345678只把12345赋予变量a,其余部分被截去。又如:
scanf("%4d%4d",&a,&b);
输入12345678将把1234赋予a,而把5678赋予b。
4) 长度
长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。
使用scanf函数还必须注意以下几点:
☆scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。
☆scanf中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
☆在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
☆在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
例如:
scanf("%c%c%c",&a,&b,&c);
输入 d、e、f 则把'd'赋予a,' ' 赋予b,'e'赋予c。只有当输入为 def 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
如果在格式控制中加入空格作为间隔,如:
scanf ("%c %c %c",&a,&b,&c);
则输入时各数据之间可加空格。
☆如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
例如:
scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7。又如:
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
则输入应为:a=5,b=6,c=7。
若scanf语句的格式串中没有非格式字符,在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。下面给出一个示例:
#include <stdio.h>
int main(void){
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
在本例中,由于scanf函数本身不能显示提示串,可先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,等待用户输入。由于scanf语句的格式串中没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。
使用Dev-C++ 运行,参见下图: