所谓输入输出是以计算机为主机而言的。
C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的。
printf函数 和 scanf函数 不是 C语言提供的输入输出语句,也不是 C语言的关键字, 而只是 库函数的名字,函数声明在 stdio.h 这个库里面。
为什么不提供输入输出语句呢? 答曰:为了使编译阶段不涉及计算机硬件操作,从而使编译系统简化,通用性强,可移植性好。
各种C编译系统提供的系统函数库是各软件公司编制的。
如果源程序中有printf 函数,在编译时并不把他翻译成目标指令,而是在连接阶段与系统函数库相连接后,在执行阶段中调用函数库中的printf函数。
要在程序文件开头用预处理指令 # include 把有关头文件放在本程序中。
# include <> 称为标准方式,编译系统从存放编译系统的子目录中去找所要包含的文件(如 stdio.h)
# include "" 先在当前目录,一般是用户存放源程序文件的子目录找,找不到再按标准方式找
printf 函数
一般格式: printf(格式控制,输出表列)
格式控制:包含格式声明和普通字符
格式声明:% + 格式字符(d、f、c、s……) 普通字符(原样输出的字符):换行、空格、逗号等字符
printf(参数1,参数2,参数3,参数4)
其中:参数1是格式控制字符串,其他参数都是需要输出的数据
格式字符
格式字符 | 说明 |
|---|---|
d,i | 以带符号的十进制形式输出整数(正数不输出符号) |
o | 以八进制无符号形式输出整数(不输出前导符0) |
x,X | 以十六进制无符号形式输出整数(不输出前导符0x),用x则输出十六进制数的a~f时以小写形式输出,用X时,则以大写字母输出,还可以在X前加一个#,这样输出就会有个提示的0x数字(scanf不能加#) |
u | 以无符号十进制形式输出整数 |
c | 以字符形式输出,只输出一个字符 |
s | 输出字符串 |
f | 以小数形式输出单、双精度数,隐含输出6位小数 |
e,E | 以指数形式输出实数,用e时指数以“e”表示(如1.2e+02),用E时指数以“E”表示(如1.2E+02) |
g,G | 选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0。用G时,若以指数形式输出,则指数以大写表示 |
格式附加字符
在格式控制字符串的格式声明中(%+上表的格式字符)可以插入格式附加字符(又称为修饰符)
长度修正符
l:对整型指定为long型,对实型指定为double型
printf("%ld\n",38977736L); //以长整型输出
printf("%lf\n",3.143); //以double型输出
h: 只用于将整型的格式字符修正为short 型 %hd
域宽及精度描述符
用一个自然数指域宽:用一个自然数表示域宽,即对应的输出项在输出设备所占的字符数
printf("%5d",54)
//输出结果
(此处三个空格)54
用一个小数指精度:用于说明实型小数的小数位数,对于字符串、则表示截取字符串的字符个数
printf("%.1lf\n",54.485678);//输出54.5
printf("%.2lf\n",54.4);//输出54.40
printf("%3.2lf\n",54.4);//输出54.40
printf("%6.1lf\n",54.485678);//输出(2个空格)54.5
printf("%3.2lf\n",54.485678);//输出54.49
//.n 表示以n位小数输出结果,多的以四舍五入截取,少的补0
//m.n m表示所占字符,n表示小数位数。
//不指定小数位数,默认按6位输出
//优先满足小数位数的要求
//如果满足小数位数的要求后导致整个数字字符长度超过m的大小,整数部分也不会截取的。
//如果m大于满足小数位数的要求且加上整数部分的字符为数,输出结果前边补空格
指定空位是否填0
printf("%010d\n",54);
//输出结果:
0000000054
Press any key to continue . . .
小短线 - 用于指定是否左对齐输出
printf("%5d",54);
// 54Press any key to continue . . .
printf("%-5d",54);
//54 Press any key to continue . . .
为什么要有输出控制符 同样的0101二进制可能表达的是数据也有可能表达的是指令。
一组二进制数据如果表达的是数字的话,以不同格式输出,会有不同的输出结果。
scanf 函数
一般格式 scanf(格式控制,地址表列) 地址表列:&变量地址||&字符串首地址
功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中
格式字符 基本上和printf的一样
注意:在以十六进制输入时,不能和printf一样,在x前边加一个#,也就是说类似于%#x只能printf用。
格式附加字符
和printf一样可指定域宽。
不可以用小短线表示左对齐。
其他注意问题
非输入控制符必须原样输入,例子如下:
double a;
int b;
scanf("a=%lf,b=%d",&a,&b);
printf("%lf,%d\n",a,b);
//像这句输入时不能只写数字,必须输入a=数字,b=数字[逗号也得输入]
scanf("%d,%d,%d",&a,&b,&c)
结果:
6 8 9 //这些是键盘输入的带空格的
6 -858993460 -858993460 //这是屏幕输出
请按任意键继续. . .
可见只有第一个字符能正确输出
所以必须原样输入非控制字符
在用%c的格式说明输入字符时,空格和转义字符都作为有效数字输入,例子如下
char a,b,c;
scanf("%c%c%c",&a,&b,&c);
printf("%c\n%c\n%c\n",a,b,c);
//这段代码运行时直接连续输入三个字符,中间不能加空格或者是其他任何符号,这些符号都会算有效字符!!!
在输入时,遇到回车、Tab、空格或者其他非法字符时会认为输入结束。 以第一段程序为例:
double a;
int b;
scanf("a=%lf,b=%d",&a,&b);
printf("%lf,%d\n",a,b);
//像这句输入时不能只写数字,必须输入a=数字,b=数字[逗号也得输入]
//
这段程序运行,输入
a=4.7,b=9
需要点一次回车
或者点一次空格
或者点一次Tab
会运行printf那句,输出结果。
以什么格式控制符输入,就必须以哪种格式从键盘输入
以十进制数字格式输入,就不能输入字符'A'(区别于printf)
int a;
int b;
int c;
scanf("%d,%d,%d",&a,&b,&c);
printf("%d %d %d\n",a,b,c);
//第一种
A,C,77
-858993460 -858993460 -858993460
请按任意键继续. . .
//第二种
4,6,A
4 6 -858993460
请按任意键继续. . .
scanf格式控制千万不要习惯性加\n,这是非常不好的行为
int a;
scanf("%d\n",&a);
printf("%d\n",a);
//结果
4
\n //这些都是输入,直到原样输入\n才能结束输入
4 //这是输出结果
请按任意键继续. . .
对用户非法输入的处理
//非法输入示例
int a;
int b;
printf("请以十进制整数形式输入a的值:")
scanf("%d",&a);
printf("请以十进制整数形式输入b的值:")
scanf("%d",&b);
printf("\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
//第一种错误
请以十进制整数形式输入a的值:123m(输入124m后回车输出结果,发现把垃圾值给了b)
请以十进制整数形式输入b的值:
a=123
b=-858993460
请按任意键继续. . .
//用程序实现当我们要接受一个数据前把前面的垃圾值去掉。
//例如本案例,123m,这个m是前一个数据输入非法值,却把这个垃圾值赋给了b。如何避免呢???
//也就是自动丢弃非法输入的值,不要保留至下次输入。
//在下一个输入前加一句:
while((getchar())!='\n')
continue;
//示例:
int main()
{
int a;
int b;
printf("请以十进制整数形式输入a的值:");
scanf("%d",&a);
while((getchar())!='\n')
continue;
printf("请以十进制整数形式输入b的值:");
scanf("%d",&b);
printf("\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
system("pause");
return 0;
}
//效果
请以十进制整数形式输入a的值:123m
请以十进制整数形式输入b的值:345
a=123
b=345
请按任意键继续. . .
putchar函数 输出
作用 putchar(c); 向终端输出一个字符c,变量可以是字符型'A'也可以是整型:56,整型数据代表输出是这个整型数字所代表的ASCII字符
int main()
{
char a;
char b;
a=65;
b='A';
putchar(a);
putchar('\n');
putchar(b);
putchar('\n');
system("pause");
return 0;
}
//结果如下:
A
A
请按任意键继续. . .
注意点
可以输出控制字符:putchar('\n');单引号哦
可以输出转义字符
一次只能输出一个字符,输出多个必须用多条语句
getchar()函数,字符输入函数
作用 getchar();
从终端输入一个字符,函数的值是从输入设备得到的字符
int main()
{
char a;
a=getchar();
putchar(a);
putchar('\n');
system("pause");
return 0;
}
//输出即所得,数字不代表ASCII,只是一个字符格式的数字,且只能有一位
//输入65,输出只能保留6
//输入2,输出2
//区别于putchar
注意点
getchar()只能接受一个字符
它所得到的值可以赋给一个字符变量或一个整型变量,也可以不赋给任何变量,作为表达式的一部分。
putchar(getchar());
本文章使用limfx的vsocde插件快速发布