C 输入 & 输出

C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。
表1 标准文件

标准文件文件指针
标准输入stdin
标准输出stdout
标准错误stderr

表2 stdio.h中的基本输入输出函数

input functionsoutput functions
getchar()putchar()
gets()puts()
scanf()printf()

getchar()函数

getchar()函数的作用是从标准的输入stdin中读取字符。也就是说,getchar()函数以字符为单位对输入的数据进行读取。简而言之getchar()函数一次读取一个字符,并将其存储在一个变量中。如:

ch = getchar();//从键盘输入获取一个字符,并将其存储在ch中

在控制台中通过键盘输入数据时,以回车键作为结束标志。当输入结束后,键盘输入的数据连同回车键一起被输入到输入缓冲区中。在程序中第一次调用getchar()函数从输入缓冲区中读取一个字节的数据。需要注意的是,如果此时在程序中第二次调用getchar()函数,因为此时输入缓冲区中还有回车键的数据没有被读出,第二个getchar()函数读出的是回车符。可以使用rewind()函数来清理输入缓冲区中的数据。如:

ch = getchar();//得到输入的字符
rewind(stdin);//清除键盘输入缓存中的内容,即清除回车

putchar()函数

putchar函数的基本格式为:putchar(int c);
当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符);
当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;
当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。
当整型变量c超出8位变量的范围时,c则会变强制转化为8位变量(即取其低八位传过去输出),当为负数的时候,由于计算机存储负数是用补码表示的,所以传过去的二进制补码也被当做正数处理,也是取其低八位。

gets()函数

在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回。如果要读取一行字符串,比如:I love you!,这种情况,scanf()就无能为力了。这时我们最先想到的是用gets()读取.
gets()函数从标准输入(键盘)读入一行数据,所谓读取一行,就是遇到换行符就返回。gets()函数并不读取换行符’\n’,它会把换行符替换成空字符’\0’,作为c语言字符串结束的标志。
gets()函数存在一个严重的缺陷,这个缺陷就是:它不会检查数组是否能够装得下输入行。
如果输入的字符串过长,会导致缓冲区溢出(buffer overflow),即多余的字符超出了指定的目标空间。gets()函数就会访问未被分配的内存空间,如果这些内存未被使用,不会立即出现问题;如果这片空间已经存有数据,就会擦除掉程序中的其他数据,会导致程序中止。
我们可以用fgets()函数来代替gets(),如果不希望程序中止或退出当输入太长,超过数组容纳的字符时,fgets()最容易使用,而且可以选择不同的处理方式。

puts()函数

函数原型:int puts(const char *string);
功能:向控制台输出一串字符串,即送一字符串到stdout中
参数:输入:字符串指针,输入可以是字符串数组,也可以是字符串常量
gets()函数经常和puts()函数配对使用,puts()函数用于显示字符串,并自动在字符串后面添加一个换行标志’\n’

scanf()函数

scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
其调用格式为: scanf("<格式化字符串>",<地址表>);
需要多个输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。
使用地址运算符&加变量名来将读取到的信息保存到相应的地址,若是字符串变量,则无需&,因为字符串变量的变量名即为地址(同数组名)。
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。
其控制串由三类字符构成:格式化说明符;空白符;非空白符;
表3 格式化说明符

格式串含义
%c读入一个字符
%s读入一个字符串
%i读入一个整数
%d读入一个十进制整数
%f读入一个单精度浮点
%lf读入一个双精度浮点
%o读入一个八进制整数
%x或%X读入一个十六进制整数
%e或%E读入一个科学计数法数值,如1.2e5
%p读入一个指针
%%读入一个%符号

空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。

  1. 遇空格、“回车”、“跳格”键
  2. 遇宽度结束
  3. 遇非法输入

这就造成了scanf()函数不能正确接受有空格的字符串,如: I love you!,可以使用fgets()代替。
更安全的scanf_s()函数:
scanf_s() 的功能虽然与scanf() 相同,但却比 scanf() 安全,因为 scanf_s() 是针对“ scanf()在读取字符串时不检查边界,可能会造成内存泄露”这个问题设计的。
scanf_s()用于读取字符串时,必须提供一个数字以表明最多读取多少位字符,以防止溢出。

printf()函数

printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
printf()函数的调用格式为: printf("<格式化字符串>", <参量表>);
其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%“开始, 后跟一个或几个规定字符, 用来确定输出内容格式。
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用”,"分开, 且顺序一一对应, 否则将会出现意想不到的错误。
注意:函数printf从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有我们看见的结果是,从右边开始处理的。
表4 格式化规定符

符号作用
%d十进制整数
%u十进制无符号整数
%f浮点数
%s字符串
%c单个字符
%p指针的值
%e指数形式的浮点数
%x或%X无符号十六进制整数
%g自动选择合适的表示法

可以在"%"和字母之间插进数字或变量表示最大场宽
  例如: %3d 表示输出3位整型数, 不够3位右对齐。
  %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。
  %8s 表示输出8个字符的字符串, 不够8个字符右对齐。
如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出。若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。
另外, 若想在输出值前加一些0, 就应在场宽项前加个0。
  例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽度为4位。
如果用浮点数表示字符或整型量的输出格式, 小数点后的数字代表最大宽度, 小数点前的数字代表最小宽度。
  例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除。
可以在"%"和字母之间加小写字母l, 表示输出的是长型数
  例如: %ld 表示输出long整数 ;%lf 表示输出double浮点数
可以控制输出左对齐或右对齐, 即在"%“和字母之间加入一个”-" 号可说明输出为左对齐, 否则为右对齐。
  例如: %-7d 表示输出7位整数左对齐 ;%-10s 表示输出10个字符左对齐 ;%-m.nf表示输出数据共占m列,n位小数,如果数据长度小于m那么左靠齐,右补空格.
表5 一些特殊规定字符

字符作用
\n换行
\f清屏并换页
\r回车
\tTab符
\xhh一个ASCII码用16进制表示,hh表示1到2个16进制数

另:反斜杠、单引号、双引号的输出在之前多加一个反斜杠即可。

参考文献

https://blog.csdn.net/hou09tian/article/details/80741890
http://www.runoob.com/cprogramming/c-input-output.html
https://blog.csdn.net/libing403/article/details/73076925?utm_source=blogxgwz0
https://blog.csdn.net/libing403/article/details/73010866
https://blog.csdn.net/hk_kang/article/details/78747726
https://blog.csdn.net/silleyj/article/details/8545408
https://blog.csdn.net/jiangkaiyao001/article/details/9243255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值