C语言基础摘要--四、实用标准C I/O
本帖最后由 czlhxm 于 2017-7-26 16:56 编辑本章可能有些许解释错误,请多包含
4.1 标准输出
printf函数:int printf( const char *format, ... ) ;
根据给定格式字符串打印字符,返回打印(故不包含字符串结尾\0)的字符数,若给定参数少于格式输出符,那么剩下格式输出的值为随机值。
实用(用来美化打印数据表格)的格式修饰符:
1. %4d对应的整型参数若小于4位数,则前面多出的位数补空格,若大于4位数则直接打印。
2. %5.2f打印对应浮点型参数(包括小数点)的五个字符,其中有两位为小数位,如若参数为3.1415,则打印结果为: 3.14(3前面有个空格)。
3. %-10d可使对应的整型参数以10位为长度左对齐。
4. %010d可使对应整型参数若小于10位数,则前面用0而不是空格填充。
5. % d(d前面有个空格)可使对应的整型参数若为正号则不显示正号而用空格代替,若为负号显示负号。
6. %+d可使对应的整型参数显示正负号。
常用printf/scanf格式码:
%d 十进制整型 %o 八进制整型 %x 十六进制整型
%g 浮点值 %c 打印字符 %s 字符串
\n 换行符 \ld 长整型 %f 浮点型
%lf 双精度浮点型
注意:在格式修饰符中还存在一种%*d,*可代表限制的位数的数字,如printf("%*d",width,number) ;其中width代替了如下的数字常量4,使得打印使的宽度可以交由程序动态设置:实用(用来美化打印数据表格)的格式修饰符:
1. %4d对应的整型参数若小于4位数,则前面多出的位数补空格,若大于4位数则直接打印。
......
printf参数传递机制(注意):根据格式串中对应格式符对应的数据大小读取,那么在printf("%ld%ld",n1,n2) ;中假如n1占8个字节,而%ld只读取4个字节,printf将打印n1的前4个字节表示的数字和n1后4个字节表示的数字,n2将完全不起作用!所以注意传参时的数据类型转换。
如果你要打印的字符串很长,在代码编辑器里显得不好看,可以采用以下方式书写:
printf("一段字符"
"一段字符"
"一段字符") ;
/*--------------------------------------------------------我是分割线------------------------------------------------------*/
putchar函数:int putchar( int ch ) ;
打印一个给定的字符,成功返回被打印字符,失败返回EOF。
/*--------------------------------------------------------我是分割线------------------------------------------------------*/
puts函数:int puts(const char *string);
打印字符串并换行,成功返回非负数,失败返回EOF。
4.2 标准输入
scanf函数:int scanf( const char *format, ... );
根据给定格式字符串读取输入数据,返回成功赋值的参数个数,出错返回EOF。
实用的格式修饰符:
%4d使读入对应的整数只取前4位,如scanf("%4d", &a) ;输入54321 ,a的值为5432。
注意:
1. scanf读取由任意制表符、空格、换行分隔开的数据,但格式符为%c时例外因为空格也算作字符。
2.scanf中修饰符*可起到如printf中相同作用: 注意:在格式修饰符中还存在一种%*d,*可代表限制的位数的数字,如printf("%*d",width,number) ;其中width代替了如下的数字常量4,使得打印使的宽度可以交由程序动态设置
......
/*--------------------------------------------------------我是分割线------------------------------------------------------*/
getchar函数:int getchar( void ) ;
从标准输入中获取一个字符,返回获取字符。
/*--------------------------------------------------------我是分割线------------------------------------------------------*/
getch函数:int getch( void ) ;
从标准输入中获取一个字符,返回获取字符。同getchar字符的区别是,getch获取字符不会在窗口显示,同时也不需要同getchar输入数据回车后才获取字符,故getch常用于控制台程序中简单的获取键盘输入。
如在控制台贪吃蛇中获取用户键盘输入的一种实现方法:if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
{
while(kbhit() != 0)//可能存在多个按键,要全部取完,以最后一个为主
value = getch(); //将按键从控制台中取出并保存到key中
}
/*--------------------------------------------------------我是分割线------------------------------------------------------*/
gets函数:char*gets( char*buffer ) ;
读取一串字符,遇到换行或到达EOF,丢弃换行符并于末尾添加\0,返回参数buffer的指针,注意buffer大小要确保足够接收输入的字符否则会溢出。
4.3 缓冲区
缓冲区是标准输入输出的枢纽,如果说输入输出函数是食材与佳肴的流入流出,那么缓冲区就是厨房。
缓冲区是内存中的一片区域,有默认大小,用于输入和输出数据。缓冲区的存在使得字符数据以块的形式处理(更高效)。
输入回显:当你输入一个字符时在控制台中可观察到。
非缓冲输入:输入的内容对程序来说立即可用如:在游戏中按下某键就执行、getch函数。
缓冲输入:输入的内容先在缓冲区中等待特定信号(如回车),再交由程序调用,如在输入中输入错误可反复修改,正确后再交给程序。
缓冲输入又分为完全缓冲和行缓冲:完全缓冲指填满缓冲区后再进行处理,行缓冲指遇到换行符时进行处理。
4.4 给读者朋友的话(实属废话可忽略)
既然你读到这儿了,或者是跳到这儿了,请君悉听一席话:
C语言的输入输出(控制台)是一个很重要的知识点,以上仅为一些重点要点,因为参考的是百度、C参考手册、C primer plus所以篇幅略长但也许还是会漏掉一些知识点,请见谅。为什么要学那么深,输入输出不就是printf和scanf就了么?因为更为复杂又高效的程序远不止这两条函数就能解决,就如笔者曾遇到的编写贪吃蛇问题,如果不是知道了getch的非回显和非缓冲,就可能得调用复杂的win api处理实现接收按键的功能。在c primer plus还举出很多例子如一边读取一边抛弃特定的字符等等,这就需要用输出输入实现更复杂的算法。同时在需要输出并换行使用puts,输出单字符使用putchar能使程序更加简洁高效。希望我的学习笔记能尽量帮助诸位留心在学习和实际使用C基础中的细节,同时也希望诸位不要局限于文章的篇幅而漏掉了文章忽略的知识点。
页:
[1]