关于C语⾔中getchar()的详细使⽤
(此贴对⾃⼰受⽤,来源⽹络,在此分享)在中有个重要的库函数getchar(),可从终端获得⼀个字符的ASCII码值。在终端输⼊字符时并⾮输⼊⼀个字符就会返回,⽽是在遇到回车换⾏前,所有输⼊的在C语⾔中有个重要的库函数getchar(),可从终端获得⼀个字符的ASCII 码值。在终端输⼊字符时并⾮输⼊⼀个字符就会返回,⽽是在遇到回车换⾏前,所有输⼊的字符都会缓冲在键盘缓冲器中,直到回车换⾏⼀次性将所有字符按序依次赋给相应的变量,在这⾥⼀定要注意最后⼀个字符即'\n',该字符也会赋给⼀个相应的变量(当然这要你定义的⽤来接收字符的变量数⽐你输⼊的可见字符多⼀才可以)。
  其实,getchar()最典型的程序也就⼏⾏代码⽽已。本⼈所⽤的环境是DebianGNU/Linux,在其他系统下也⼀样。
  ⼀、getchar的两点总结:
  1.getchar是以⾏为单位进⾏存取的。
  当⽤getchar进⾏输⼊时,如果输⼊的第⼀个字符为有效字符(即输⼊是⽂件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux下为组合键Ctrl+D),那么只有当最后⼀个输⼊字符为换⾏符'\n'(也可以是⽂件结束符EOF,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的原因。
  2.getchar()的返回值⼀般情况下是字符,但也可能是负值,即返回EOF。
  这⾥要强调的⼀点就是,getchar函数通常返回终端所输⼊的字符,这些字符系统中对应的ASCII值都是⾮负的。因此,很多时候,我们会写这样的两⾏代码:
  char c;
  c = getchar();
  这样就很有可能出现问题。因为getchar函数除了返回终端输⼊的字符外,在遇到Ctrl+D(Linux下)即⽂件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库⾥⼀般定义为-1。因此,在这种情况下,getchar函数返回⼀个负值,把⼀个负值赋给⼀个char型的变量是不正确
回EOF,这个EOF在函数库⾥⼀般定义为-1。因此,在这种情况下,getchar函数返回⼀个负值,把⼀个负值赋给⼀个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义⽅法如下(K&R C中特别提到了这个问题):
  int c;
  c = getchar();
  ⼆、EOF的两点总结(主要指普通终端中的EOF)
  1.EOF作为⽂件结束符时的情况:
  EOF虽然是⽂件结束符,但并不是在任何情况下输⼊Ctrl+D(Windows下Ctrl+Z)都能够实现⽂件结束的功能,只有在下列的条件下,才作为⽂件结束符。
  (1)遇到getchar函数执⾏时,要输⼊第⼀个字符时就直接输⼊Ctrl+D,就可以跳出getchar(),去执⾏程序的其他部分;
  (2)在前⾯输⼊的字符为换⾏符时,接着输⼊Ctrl+D;
c语言char的用法  (3)在前⾯有字符输⼊且不为换⾏符时,要连着输⼊两次Ctrl+D,这时第⼆次输⼊的Ctrl+D起到⽂件结束符的功能,⾄于第⼀次的Ctrl+D 的作⽤将在下⾯介绍。
  其实,这三种情况都可以总结为只有在getchar()提⽰新的⼀次输⼊时,直接输⼊Ctrl+D才相当于⽂件结束符。
  2.EOF作为⾏结束符时的情况,这时候输⼊Ctrl+D并不能结束getchar(),⽽只能引发getchar()提⽰下⼀轮的输⼊。
  这种情况主要是在进⾏getchar()新的⼀⾏输⼊时,当输⼊了若⼲字符(不能包含换⾏符)之后,直接输⼊Ctrl+D,此时的Ctrl+D并不是⽂件结束符,⽽只是相当于换⾏符的功能,即结束当前的输⼊。以上⾯的代码段为例,如果执⾏时输⼊abc,然后Ctrl+D,程序输出结果为:
  abcabc
  注意:第⼀组abc为从终端输⼊的,然后输⼊Ctrl+D,就输出第⼆组abc,同时光标停在第⼆组字符的c后⾯,然后可以进⾏新⼀次的输⼊。这时如果再次输⼊Ctrl+D,则起到了⽂件结束符的作⽤,结束getchar()。
  如果输⼊abc之后,然后回车,输⼊换⾏符的话,则终端显⽰为:
  abc        //第⼀⾏,带回车
  abc        //第⼆⾏
  //第三⾏
  其中第⼀⾏为终端输⼊,第⼆⾏为终端输出,光标停在了第三⾏处,等待新⼀次的终端输⼊。
  从这⾥也可以看出Ctrl+D和换⾏符分别作为⾏结束符时,输出的不同结果。
  EOF的作⽤也可以总结为:当终端有字符输⼊时,Ctrl+D产⽣的EOF相当于结束本⾏的输⼊,将引起getchar()新⼀轮的输⼊;当终端没有字符输⼊或者可以说当getchar()读取新的⼀次输⼊时,输⼊Ctrl+
D,此时产⽣的EOF相当于⽂件结束符,程序将结束getchar()的执⾏。字符都会缓冲在键盘缓冲器中,直到回车换⾏⼀次性将所有字符按序依次赋给相应的变量,在这⾥⼀定要注意最后⼀个字符即'\n',该字符也会赋给⼀个相应的变量(当然这要你定义的⽤来接收字符的变量数⽐你输⼊的可见字符多⼀才可以)。
  其实,getchar()最典型的程序也就⼏⾏代码⽽已。本⼈所⽤的环境是DebianGNU/Linux,在其他系统下也⼀样。
  ⼀、getchar的两点总结:
  1.getchar是以⾏为单位进⾏存取的。
  当⽤getchar进⾏输⼊时,如果输⼊的第⼀个字符为有效字符(即输⼊是⽂件结束符EOF,Windows下为组合键Ctrl+Z, Unix/Linux 下为组合键Ctrl+D),那么只有当最后⼀个输⼊字符为换⾏符'\n'(也可以是⽂件结束符EOF,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的原因。
  2.getchar()的返回值⼀般情况下是字符,但也可能是负值,即返回EOF。
  这⾥要强调的⼀点就是,getchar函数通常返回终端所输⼊的字符,这些字符系统中对应的ASCII值都是⾮负的。因此,很多时候,我们会写这样的两⾏代码:
  char c;
  c = getchar();
  这样就很有可能出现问题。因为getchar函数除了返回终端输⼊的字符外,在遇到Ctrl+D(Linux下)即⽂件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库⾥⼀般定义为-1。因此,在这种情况下,getchar函数返回⼀个负值,把⼀个负值赋给⼀个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值,正确的定义⽅法如下(K&R C中特别提到了这个问题):
  int c;
  c = getchar();
  ⼆、EOF的两点总结(主要指普通终端中的EOF)
  1.EOF作为⽂件结束符时的情况:
  EOF虽然是⽂件结束符,但并不是在任何情况下输⼊Ctrl+D(Windows下Ctrl+Z)都能够实现⽂件结束的功能,只有在下列的条件下,才作为⽂件结束符。
  (1)遇到getchar函数执⾏时,要输⼊第⼀个字符时就直接输⼊Ctrl+D,就可以跳出getchar(),去执⾏程序的其他部分;
  (2)在前⾯输⼊的字符为换⾏符时,接着输⼊Ctrl+D;
  (3)在前⾯有字符输⼊且不为换⾏符时,要连着输⼊两次Ctrl+D,这时第⼆次输⼊的Ctrl+D起到⽂件结束符的功能,⾄于第⼀次的Ctrl+D的作⽤将在下⾯介绍。
  其实,这三种情况都可以总结为只有在getchar()提⽰新的⼀次输⼊时,直接输⼊Ctrl+D才相当于⽂件结束符。
  2.EOF作为⾏结束符时的情况,这时候输⼊Ctrl+D并不能结束getchar(),⽽只能引发getchar()提⽰下⼀轮的输⼊。
  这种情况主要是在进⾏getchar()新的⼀⾏输⼊时,当输⼊了若⼲字符(不能包含换⾏符)之后,直接输⼊Ctrl+D,此时的Ctrl+D并不是⽂件结束符,⽽只是相当于换⾏符的功能,即结束当前的输⼊。以上⾯的代码段为例,如果执⾏时输⼊abc,然后Ctrl+D,程序输出结果为:
  abcabc
  注意:第⼀组abc为从终端输⼊的,然后输⼊Ctrl+D,就输出第⼆组abc,同时光标停在第⼆组字符的c后⾯,然后可以进⾏新⼀次的输⼊。这时如果再次输⼊Ctrl+D,则起到了⽂件结束符的作⽤,结束getchar()。
  如果输⼊abc之后,然后回车,输⼊换⾏符的话,则终端显⽰为:
  abc        //第⼀⾏,带回车
  abc        //第⼆⾏
  //第三⾏
  其中第⼀⾏为终端输⼊,第⼆⾏为终端输出,光标停在了第三⾏处,等待新⼀次的终端输⼊。
  从这⾥也可以看出Ctrl+D和换⾏符分别作为⾏结束符时,输出的不同结果。
  EOF的作⽤也可以总结为:当终端有字符输⼊时,Ctrl+D产⽣的EOF相当于结束本⾏的输⼊,将引起getchar()新⼀轮的输⼊;当终端没有字符输⼊或者可以说当getchar()读取新的⼀次输⼊时,输⼊Ctrl+D,此时产⽣的EOF相当于⽂件结束符,程序将结束getchar()的执⾏。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。