标签:art utc 遇到 取数据 getchar 数组使用 存在 printf 请求
从输入流中读取一个单个的字符。如果输入的是字符串,函数也只读取头一个字符,如果下面还有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的原因。
原文链接:https://blog.csdn.net/fly__chen/article/details/53186870
输出单个字符。(从缓冲区中读取)
函数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(“Hello world.”); == printf(“Hello world.\n”);
(c++)程序的输入都建有一个缓冲区,即输入缓冲区。每次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。(如果要避免这个特性,可在cin前用cin.sync()来清楚缓冲区的数据)
这一输入操作,在遇到结束符(Space、Tab、Enter)就结束,且对于结束符,并不保存到变量中。注意:最后一个enter也在缓冲区。
接收一个字符ch。注意,cin.get()并不会舍弃结束符(Space、Tab、Enter),在紧接着的下一次cin.get()操作中,依然会将其读取进去,并加以显示等操作。可以用cin.get()吸收缓冲区的空格或者换行
接收一定长度的字符串(长度若为n,最多接收n-1个字符,最后一个留给‘\0‘,自动添加),结束符为可选参数,默认为Enter,可以接受Space 、Tab,对于结束符的处理同样要注意,结束符并不会被丢弃。只有一种情况缓冲区没有结束符:当一开始第一个输入字符(即前面无其他任何字符)就遇到结束符情况下,缓冲区中将无该结束符。
与cin.get(字符数组名,接收长度,结束符)用法极为类似,不同的是cin.get()每次读取一整行并把由Enter键生成的换行符留在缓冲队列中,然而cin.getline()每次读取一整行并把由Enter键生成的换行符抛弃。而且cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。
例如getline(cin,str);
结束符为可选参数(默认依然为enter)。getline()与前面的诸多存在的差别在于,它string库函数下,而非前面的istream流,所有调用前要在前面加入#include<string>。与之对应这一方法读入时第二个参数为string类型,而不再是char*。另外,该方法和指定结束符的其他输入函数一样,也不是遇到空白字符(tab, space, enter(当结束符不是默认enter时))就结束输入的,且会丢弃最后一个换行符。(丢弃最后的换行符是getline才会有的特点)
参考:https://blog.csdn.net/qq_36554582/article/details/83151897?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
标签:art utc 遇到 取数据 getchar 数组使用 存在 printf 请求
原文地址:https://www.cnblogs.com/wsshub/p/12538930.html