C语言第3天标准的输入输出函数

 
【1】putchar
 
格式: putchar( c )
参数: c常量、变量或表达式
功能:把字符c输出到标准输出上
返值:正常,为显示的代码值;也就是字符的ascii
 
 
【2】getchar
 
格式:getchar( void )
功能:从标准输入上读一字符
返值:正常,返回读取的代码值;出错,返回EOF(-1)
 
1--- 从终端获取一个字符
2--- 吃掉一个垃圾字符
       什么时候吃掉? 
    一般是在这个时候前面是什么无所谓,关键是你在下一个scanf前面按了回车键而你的这个scanf又是接收字符串的。那就废了。原因分析如下,当你按下回车键的时候后面又是接收字符串的scanf或者是getchar他们由于要读取缓冲区里面的内容就会把这个回车都取到,而回车有恰恰是结束都取,所以就会直接结束!而如果你的后面的scanf不是读取字符比如你读取的是%d,那就不存在问题。还有就是如果你的下一次读取是字符串也是没关系的,因为在%s也是会过滤掉前面的空格 回车的。为什么不存在问题?那是因为整形输入会忽略之前的空格、回车,并且以之后的空格、回车作为输入整形结束的标志。还有就是不要有误区:不要认为你printf输出空格会影响scanf这完全是俩回事,因为printf输出的东西是在输出文件流而你在输入缓冲区。还有一种情况就是人家要求你输入整形数据%d,但是你偏偏要输入字符型数据,这时,这个字符型并不会被scanf读取走,下一次读取就会出现问题
这个时候缓冲区里面已经是上一次字符的ascii码了,可以读取了。就会出错。
 
【3】printf
 
格式:printf(“格式控制串”,输出表)
功能:按指定格式向显示器输出数据
返值:正常,返回输出字节数;出错,返回EOF(-1)  比如 120 返回值就是3 ; 123 返回值是 4.
 
 
1--- 数据类型的控制
%d  %o   %x   %u
%f
%c
%p打印数据在内存中的地址(使用取地址符:&)
 
3---字符串
%s要求传递一个地址量(字符串常量当作地址量处理)
遇到''结束输出;
.n对字符串,指定实际输出位数
 
2--- 格式控制
m输出数据域宽,数据长度<m,左补空格
.n对实数,指定小数点后位数(四舍五入)
-输出数据在域内左对齐(缺省右对齐)
+指定在有符号数的正数前显示正号(+)
0输出数值时指定左面不使用的空位置自动填0
#在八进制和十六进制数前显示前导0,0x
 
 
【4】scanf
 
格式: scanf(“格式控制串”,地址表)
功能:按指定格式从键盘读入数据,存入地址表指定存储单元中,并按回车键结束
返值:正常,返回从标准输入成功获取数据的个数 也就是输入几个数
 
1--- 数据类型的控制
%d  %o   %x   %u
%f
%c
%p//打印数据存储的地址
 
2--- 格式间隔符为:空格、换行符、无间隔可通用
 
3--- 字符串
char a[10] = {'a','b','c','d',''};
scanf("%s",a);
printf("%s ",a);
 
//数组名是数组的首元素的地址
//%[^ ]
 
 
【5】puts
int puts(char * s);
 
1--- char * //要求你传递一个地址量,char型数据的地址量
2--- 默认带换行,遇‘’字符结束输出;
4--- 返回值:返回输出字节数 注意+1有/0.
 
 
【6】gets
char * gets(char *)
 
1--- 功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动在末尾加‘’
2--- 遇' '代表结束输入
3--- 返回值:存放字符串的首地址,
 
 
 
【7】sqrt
函数:sqrt() 开方数学函数
头文件:#include <math.h>
链接库操作:gcc 1.c -lm
 
 
 
【8】if
if (表达式) 
{语句块1}                            
else
{语句块2}
 
关于scanf的若干问题 /若干陷阱
 
[cpp] view plaincopy
 
其实对于scanf的若干问题就是围绕输出控制符 %d ,%c和%s
他们之间有什么联系和区别且看下面。
当我们在读取一个整形数字的时候我们会用%d来读取。这毫无疑问。而且我们都知道此时的%d是过滤空白符的无论你如何输入都可以过滤掉,你是喜欢输入一个空格一下 还是输入一个回车一下无所谓。都可以完整接收到。但是在%c中似乎问题就没那么简单了,如果你在%d的时候你直接输入回车没关系,它会过滤掉。但是在c%可是不会的,如果你在输入的时候第一次就输入回车,那废了。程序完美结束。究其原因是:因为在读取字符的时候它会把回车也当作字符(还是合理的。回车也是字符)读入后就结束了。这也是我们常常谈的一个问题,要注意吃掉回车字符。什么意思那?就是上一条语句结束的时候我们按了一个回车,下一条语句如果是getchar或者是scanf那这个空格就会被读入。而我们无法输入。解决这个问题的方法是什么?
基本就是用一个getchar吃掉我们上一次的输入,或者是我们用一个特殊的方法就是在前面加一个空格。scanf(  %d,&a)或者getchar( a)都是可以的,为什么前面加个空格就可以了?空格也是scnaf的控制符,它的意思就是过滤空格,回车,TAB,Newline等等空白符。明白了吧。但是这也要注意 比如你今天敲代码打了个 scanf(%d%d%d ,&a,&b,&c)那废了你要是按回车根本没用。因为后面有过滤。
%s我们来谈谈,%s遇到空格就结束了对字符串的读取。你如果想输入 hellow word 那单纯的%s是不行的。这个一般就用puts  默认带换行。或者在scanf中用%[^ ]也可以实现。
 
下面是我从网上摘录的一小段
1. 
2. #include <stdio.h>  
3. 
4. int main (void)   
5. {  
6.     int i ;  
7.     char ch ;  
8.       
9.     scanf("%d",&i) ;  
10.     scanf(" %c",&ch) ;  //这行的%C前有个空格  
11.     printf("i = %d ch = %c ", i, ch) ;   
12.       
13.     /*  输入100 y 后的输出结果: 
14.         i = 100 
15.         ch = y */  
16.       
17.     return 0 ;  
18. }  
       有些朋友或许会有疑问,为什么 scanf(" %c",&ch) 中的%c 前面要加一个空格,空格的作用到底是什么…在这里可以告诉大家,%c前面的空格就是用来屏蔽空白符的,但想要弄明白这个问题,必须要知道C语言 scanf() 函数的特性,以及scanf()与缓冲区、标准输入流之间的联系。 但在此之前,我们先介绍两个专业术语。
1、缓冲区
   缓冲区是一块存放临时输入数据的内存,我们在键盘上输入数据之所以不会马上显示,就是因为数据存放在了缓冲区,在上面例子中,当我们按下回车键后,缓冲区的数据会传送到标准输入流。
2、标准输入流
   标准输入流(stdin)是文件指针,scanf()就是从标准输入流获取数据。 在以后的文章中,会接触到fscanf函数的介绍中详细解释。
   以上面代码为例,当执行到scanf()时,开始等待用户输入,当我们输入数据,在按下回车键前会把数据储存在缓冲区,按下回车键后,会把数据以及换行符( )一起传送到标准输入流(stdin)中,scanf()就是从标准输入流中或许数据,上面第一个scanf()要读入一个整数,它从标准输入流中查找,跳过空白符(空格、换行符、制表符),如果遇到数字,则开始读入,直到遇到非数字的字符结束,最后计算读取到的数值,储存到相关变量中。
   如果能理解上面一段话,那么你应该知道%c前空格的作用了,如果不能,请看看%c前不加空格程序的输出结果。
[cpp] view plaincopy
1. #include <stdio.h>  
2.   
3. int main (void)   
4. {  
5.     int i ;  
6.     char ch ;  
7.       
8.     scanf("%d",&i) ;  
9.     scanf("%c",&ch) ;  
10.     printf("i = %d ch = %c ", i, ch) ;   
11.       
12.     /*  输入100 : 
13.         i = 100 
14.         ch = */  
15.       
16.     return 0 ;  
17. }  
   请看上面的程序,我们输入100后,咦,怎么程序中止了,马上输入结果了? 但真的是终止了吗?别忘了,标准输入流中除了100外,还有一个换行符' '。 第一次scanf()读取了100后,把' '留在了标准输入流,第二个scanf()就从输入流中获取换行符了,由于scanf()函数的特性,空白符直接忽略,因此程序便结束了,第二个scanf()函数看似失效,实际上是执行完毕了。
 
 所以对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符。读到这,大家应该理解了吧?
 
原因何在,在%前面加一个空格就这么有用,答案是肯定的,就是%前面的空格在起作用,读者看看此文章的前面部分,在scanf的使用过程中应注意的问题中已经指出:“scanf()的格式控制串可以使用空白字符或其它非空白字符,使用空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。”   所以在%前面加上了空格(空格属于空白字符,此外还有像制表符等也属于空白字符),在输入过程中,将略去输入中的一个或多个空白字符,所以我们输入的0 1 2 3 4 5 6 7 8 9这些字符中的空白字符就被略去了,字符9也就正确的打印出来了,这样子解释,相信大家都看明白勒吧
 
 
其实对于scanf的若干问题就是围绕输出控制符 %d ,%c和%s
他们之间有什么联系和区别且看下面。
当我们在读取一个整形数字的时候我们会用%d来读取。这毫无疑问。而且我们都知道此时的%d是过滤空白符的无论你如何输入都可以过滤掉,你是喜欢输入一个空格一下 还是输入一个回车一下无所谓。都可以完整接收到。
但是在%c中似乎问题就没那么简单了,如果你在%d的时候你直接输入回车没关系,它会过滤掉。但是在c%可是不会的,如果你在输入的时候第一次就输入回车,那废了。程序完美结束。究其原因是:因为在读取字符的时候它会把回车也当作字符(还是合理的。回车也是字符)读入后就结束了。这也是我们常常谈的一个问题,要注意吃掉回车字符。什么意思那?
就是上一条语句结束的时候我们按了一个回车,下一条语句如果是getchar或者是scanf那这个空格就会被读入。而我们无法输入。解决这个问题的方法是什么?
基本就是用一个getchar吃掉我们上一次的输入,或者是我们用一个特殊的方法就是在前面加一个空格。scanf(  %d,&a)或者getchar( a)都是可以的,为什么前面加个空格就可以了?空格也是scnaf的控制符,它的意思就是过滤空格,回车,TAB,Newline等等空白符。
明白了吧。但是这也要注意 比如你今天敲代码打了个 scanf(%d%d%d ,&a,&b,&c)那废了
你要是按回车根本没用。因为后面有过滤。
%s我们来谈谈,%s遇到空格就结束了对字符串的读取。你如果想输入 hellow word 那单纯的%s是不行的。













 
原文地址:https://www.cnblogs.com/zhangfeionline/p/5866084.html