常用输入输出函数总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常⽤输⼊输出函数总结
getchar()函数
从输⼊流中读取⼀个单个的字符。
如果输⼊的是字符串,函数也只读取头⼀个字符,如果下⾯还有getchar函数则接着上个getchar函数读到的下⼀个字符读⽽不需要继续输⼊就会返回⼀个读取的字符,这⾥涉及到缓冲,就是我们输⼊的字符流其实是存在于缓冲区中,所以下⼀个getchar函数才能接着读取;getchar有⼀个int型的返回值.当程序调⽤getchar时.程序就等着⽤户按键.⽤户输⼊的字符被存放在键盘缓冲区中.直到⽤户按回车为⽌(回车字符也放在缓冲区中).当⽤户键⼊回车之后,getchar才开始从stdio流中每次读⼊⼀个字符.getchar函数的返回值是⽤户输⼊的第⼀个字符的ASCII码,如出错返回-1,且将⽤户输⼊的字符回显到屏幕.如⽤户在按回车之前输⼊了不⽌⼀个字符,其他字符会保留在键盘缓存区中,等待后续getchar调⽤读取.也就是说,后续的getchar调⽤不会等待⽤户按键,⽽直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待⽤户按键.
注意:当⽤getchar进⾏输⼊时,如果输⼊的第⼀个字符为有效字符(即输⼊是⽂件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D),那么只有当最后⼀个输⼊字符为换⾏符’\n’(也可以是⽂件结束符EOF, getchar才会停⽌执⾏,整个程序将会往下执⾏。
譬如下⾯程序段:
while((c = getchar()) != EOF)
{
putchar(c);
}
执⾏程序,输⼊:abc,然后回车。
则程序就会去执⾏puchar(c),然后输出abc,这个地⽅不要忘了,系统输出的还有⼀个回车。
然后可以继续输⼊,再次遇到换⾏符的时候,程序⼜会把那⼀⾏的输⼊的字符输出在终端上。
对于getchar,肯定很多初学的朋友会问,getchar不是以字符为单位读取的吗?那么,既然我输⼊了第⼀个字符a,肯定满⾜while循环(c = getchar()) != EOF的条件阿,那么应该执⾏putchar(c)在终端输出⼀个字符a。
不错,我在⽤getchar的时候也是⼀直这么想的,但是程序就偏偏不着样执⾏,⽽是必需读到⼀个换⾏符或者⽂件结束符EOF才进⾏⼀次输出。
对这个问题的⼀个解释是,在⼤师编写C的时候,当时并没有所谓终端输⼊的概念,所有的输⼊实际上都是按照⽂件进⾏读取的,⽂件中⼀般都是以⾏为单位的。
因此,只有遇到换⾏符,那么程序会认为输⼊结束,然后采取执⾏程序的其他部分。
同时,输⼊是按照⽂件的⽅式存取的,那么要结束⼀个⽂件的输⼊就需⽤到EOF (Enf Of File). 这也就是为什么getchar结束输⼊退出时要⽤EOF的原因。
putchar()函数
输出单个字符。
(从缓冲区中读取)
gets()函数
函数gets()从键盘读取⼀个字符串。
当gets()函数被调⽤时,它不断从键盘读取字符,直到遇到换⾏符(通过按enter键⽣成)为⽌。
该函数丢弃换⾏符,添加⼀个空字符,然后将字符串返回给调⽤程序。
字符串被存储到传递给gets()的char指针指向的位置。
gets()跟scanf()⼀样,存放字符完毕后(⽤字符数组存放),系统会⾃动在尾部加上⼀个结束标记\0。
gets()与scanf()的不同点:
1.gets()⼀次只能读取⼀个字符串;scanf()则可以同时读取多个字符串.
2.gets()可以读⼊包含空格、tab的字符串,直到遇到换⾏为⽌;
scanf()不能⽤来读取空格、tab,字符数组使⽤%s读⼊的时候以空格和换⾏作为结束标志,使⽤%c读⼊的时候能够识别空格和换⾏并将其输⼊(其他格式以空格,tab等作为结束标志),%c遇换⾏结束读⼊但可以读⼊换⾏,这⼀点和getchar()⼀样.
puts()函数
puts()函数接受⼀个字符串参数,显⽰该参数并**⾃动换⾏**。
例如:
puts(“Hello world.”); == printf(“Hello world.\n”);
(c++)程序的输⼊都建有⼀个缓冲区,即输⼊缓冲区。
每次输⼊过程是这样的,当⼀次键盘输⼊结束时会将输⼊的数据存⼊输⼊缓冲区,⽽cin函数直接从输⼊缓冲区中取数据。
正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据
时,cin函数会直接取得这些残留数据⽽不会请求键盘输⼊。
(如果要避免这个特性,可在cin前⽤cin.sync()来清楚缓冲区的数
据)
cin>>
这⼀输⼊操作,在遇到结束符(Space、Tab、Enter)就结束,且对于结束符,并不保存到变量中。
注意:最后⼀个enter也在缓冲区。
cin.get()
1.ch=cin.get()或cin.get(ch)
接收⼀个字符ch。
注意,cin.get()并不会舍弃结束符(Space、Tab、Enter),在紧接着的下⼀次cin.get()操作中,依然会将其读取进去,并加以显⽰等操作。
可以⽤cin.get()吸收缓冲区的空格或者换⾏
2.cin.get(字符数组名,接收长度,结束符)
接收⼀定长度的字符串(长度若为n,最多接收n-1个字符,最后⼀个留给'\0',⾃动添加),结束符为可选参数,默认为Enter,可以接受Space 、Tab,对于结束符的处理同样要注意,结束符并不会被丢弃。
只有⼀种情况缓冲区没有结束符:当⼀开始第⼀个输⼊字符(即前⾯⽆其他任何字符)就遇到结束符情况下,缓冲区中将⽆该结束符。
3.cin.getline(字符数组名,接收长度,结束符)
与cin.get(字符数组名,接收长度,结束符)⽤法极为类似,不同的是cin.get()每次读取⼀整⾏并把由Enter键⽣成的换⾏符留在缓冲队列中,然⽽cin.getline()每次读取⼀整⾏并把由Enter键⽣成的换⾏符抛弃。
⽽且cin.getline()当输⼊超长时,会引起cin函数的错误,后⾯的cin操作将不再执⾏。
getline(istream is,string str,结束符)
例如getline(cin,str);
结束符为可选参数(默认依然为enter)。
getline()与前⾯的诸多存在的差别在于,它string库函数下,⽽⾮前⾯的istream流,所有调⽤前要在前⾯加⼊#include<string>。
与之对应这⼀⽅法读⼊时第⼆个参数为string类型,⽽不再是char*。
另外,该⽅法和指定结束符的其他输⼊函数⼀样,也不是遇到空⽩字符(tab, space, enter(当结束符不是默认enter时))就结束输⼊的,且会丢弃最后⼀个换⾏符。
(丢弃最后的换⾏符是getline才会有的特点)。