此贴对自己受用来源网络在此分享在C语言中有个重要的库函数getchar()可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回而是在遇到回车换行前所有输入的在C语言中有个重要的库函数getchar()可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回而是在遇到回车换行前所有输入的字符都会缓冲在键盘缓冲器中直到回车换行一次性将所有字符按序依次赋给相应的变量在这里一定要注意最后一个字符即\n该字符也会赋给一个相应的变量当然这要你定义的用来接收字符的变量数比你输入的可见字符多一才可以。其实getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux在其他系统下也一样。一、getchar的两点总结1.getchar是以行为单位进行存取的。当用getchar进行输入时如果输入的第一个字符为有效字符(即输入是文件结束符EOFWindows下为组合键CtrlZ Unix/Linux下为组合键CtrlD)那么只有当最后一个输入字符为换行符\n(也可以是文件结束符EOFEOF将在后面讨论)时 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函数除了返回终端输入的字符外在遇到CtrlD(Linux下)即文件结束符EOF时getchar ()的返回EOF这个EOF在函数库里一般定义为-1。因此在这种情况下getchar函数返回一个负值把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值正确的定义方法如下(KR C中特别提到了这个问题)int c;c getchar();二、EOF的两点总结(主要指普通终端中的EOF)1.EOF作为文件结束符时的情况EOF虽然是文件结束符但并不是在任何情况下输入CtrlD(Windows下CtrlZ)都能够实现文件结束的功能只有在下列的条件下才作为文件结束符。(1)遇到getchar函数执行时要输入第一个字符时就直接输入CtrlD就可以跳出getchar(),去执行程序的其他部分(2)在前面输入的字符为换行符时接着输入CtrlD(3)在前面有字符输入且不为换行符时要连着输入两次CtrlD这时第二次输入的CtrlD起到文件结束符的功能至于第一次的CtrlD的作用将在下面介绍。其实这三种情况都可以总结为只有在getchar()提示新的一次输入时直接输入CtrlD才相当于文件结束符。2.EOF作为行结束符时的情况这时候输入CtrlD并不能结束getchar(),而只能引发getchar()提示下一轮的输入。这种情况主要是在进行getchar()新的一行输入时当输入了若干字符(不能包含换行符)之后直接输入CtrlD此时的CtrlD并不是文件结束符而只是相当于换行符的功能即结束当前的输入。以上面的代码段为例如果执行时输入abc然后CtrlD程序输出结果为abcabc注意:第一组abc为从终端输入的然后输入CtrlD就输出第二组abc同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入CtrlD则起到了文件结束符的作用结束getchar。如果输入abc之后然后回车输入换行符的话则终端显示为abc //第一行带回车abc //第二行//第三行其中第一行为终端输入第二行为终端输出光标停在了第三行处等待新一次的终端输入。从这里也可以看出CtrlD和换行符分别作为行结束符时输出的不同结果。EOF的作用也可以总结为当终端有字符输入时CtrlD产生的EOF相当于结束本行的输入将引起getchar()新一轮的输入当终端没有字符输入或者可以说当getchar()读取新的一次输入时输入CtrlD此时产生的EOF相当于文件结束符程序将结束getchar()的执行。字符都会缓冲在键盘缓冲器中直到回车换行一次性将所有字符按序依次赋给相应的变量在这里一定要注意最后一个字符即\n该字符也会赋给一个相应的变量当然这要你定义的用来接收字符的变量数比你输入的可见字符多一才可以。其实getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux在其他系统下也一样。一、getchar的两点总结1.getchar是以行为单位进行存取的。当用getchar进行输入时如果输入的第一个字符为有效字符(即输入是文件结束符EOFWindows下为组合键CtrlZ Unix/Linux下为组合键CtrlD)那么只有当最后一个输入字符为换行符\n(也可以是文件结束符EOFEOF将在后面讨论)时 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函数除了返回终端输入的字符外在遇到CtrlD(Linux下)即文件结束符EOF时getchar ()的返回EOF这个EOF在函数库里一般定义为-1。因此在这种情况下getchar函数返回一个负值把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值正确的定义方法如下(KR C中特别提到了这个问题)int c;c getchar();二、EOF的两点总结(主要指普通终端中的EOF)1.EOF作为文件结束符时的情况EOF虽然是文件结束符但并不是在任何情况下输入CtrlD(Windows下CtrlZ)都能够实现文件结束的功能只有在下列的条件下才作为文件结束符。(1)遇到getchar函数执行时要输入第一个字符时就直接输入CtrlD就可以跳出getchar(),去执行程序的其他部分(2)在前面输入的字符为换行符时接着输入CtrlD(3)在前面有字符输入且不为换行符时要连着输入两次CtrlD这时第二次输入的CtrlD起到文件结束符的功能至于第一次的CtrlD的作用将在下面介绍。其实这三种情况都可以总结为只有在getchar()提示新的一次输入时直接输入CtrlD才相当于文件结束符。2.EOF作为行结束符时的情况这时候输入CtrlD并不能结束getchar(),而只能引发getchar()提示下一轮的输入。这种情况主要是在进行getchar()新的一行输入时当输入了若干字符(不能包含换行符)之后直接输入CtrlD此时的CtrlD并不是文件结束符而只是相当于换行符的功能即结束当前的输入。以上面的代码段为例如果执行时输入abc然后CtrlD程序输出结果为abcabc注意:第一组abc为从终端输入的然后输入CtrlD就输出第二组abc同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入CtrlD则起到了文件结束符的作用结束getchar。如果输入abc之后然后回车输入换行符的话则终端显示为abc //第一行带回车abc //第二行//第三行其中第一行为终端输入第二行为终端输出光标停在了第三行处等待新一次的终端输入。从这里也可以看出CtrlD和换行符分别作为行结束符时输出的不同结果。EOF的作用也可以总结为当终端有字符输入时CtrlD产生的EOF相当于结束本行的输入将引起getchar()新一轮的输入当终端没有字符输入或者可以说当getchar()读取新的一次输入时输入CtrlD此时产生的EOF相当于文件结束符程序将结束getchar()的执行。
关于C语言中getchar()的详细使用
发布时间:2026/6/12 1:03:21
此贴对自己受用来源网络在此分享在C语言中有个重要的库函数getchar()可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回而是在遇到回车换行前所有输入的在C语言中有个重要的库函数getchar()可从终端获得一个字符的ASCII码值。在终端输入字符时并非输入一个字符就会返回而是在遇到回车换行前所有输入的字符都会缓冲在键盘缓冲器中直到回车换行一次性将所有字符按序依次赋给相应的变量在这里一定要注意最后一个字符即\n该字符也会赋给一个相应的变量当然这要你定义的用来接收字符的变量数比你输入的可见字符多一才可以。其实getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux在其他系统下也一样。一、getchar的两点总结1.getchar是以行为单位进行存取的。当用getchar进行输入时如果输入的第一个字符为有效字符(即输入是文件结束符EOFWindows下为组合键CtrlZ Unix/Linux下为组合键CtrlD)那么只有当最后一个输入字符为换行符\n(也可以是文件结束符EOFEOF将在后面讨论)时 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函数除了返回终端输入的字符外在遇到CtrlD(Linux下)即文件结束符EOF时getchar ()的返回EOF这个EOF在函数库里一般定义为-1。因此在这种情况下getchar函数返回一个负值把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值正确的定义方法如下(KR C中特别提到了这个问题)int c;c getchar();二、EOF的两点总结(主要指普通终端中的EOF)1.EOF作为文件结束符时的情况EOF虽然是文件结束符但并不是在任何情况下输入CtrlD(Windows下CtrlZ)都能够实现文件结束的功能只有在下列的条件下才作为文件结束符。(1)遇到getchar函数执行时要输入第一个字符时就直接输入CtrlD就可以跳出getchar(),去执行程序的其他部分(2)在前面输入的字符为换行符时接着输入CtrlD(3)在前面有字符输入且不为换行符时要连着输入两次CtrlD这时第二次输入的CtrlD起到文件结束符的功能至于第一次的CtrlD的作用将在下面介绍。其实这三种情况都可以总结为只有在getchar()提示新的一次输入时直接输入CtrlD才相当于文件结束符。2.EOF作为行结束符时的情况这时候输入CtrlD并不能结束getchar(),而只能引发getchar()提示下一轮的输入。这种情况主要是在进行getchar()新的一行输入时当输入了若干字符(不能包含换行符)之后直接输入CtrlD此时的CtrlD并不是文件结束符而只是相当于换行符的功能即结束当前的输入。以上面的代码段为例如果执行时输入abc然后CtrlD程序输出结果为abcabc注意:第一组abc为从终端输入的然后输入CtrlD就输出第二组abc同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入CtrlD则起到了文件结束符的作用结束getchar。如果输入abc之后然后回车输入换行符的话则终端显示为abc //第一行带回车abc //第二行//第三行其中第一行为终端输入第二行为终端输出光标停在了第三行处等待新一次的终端输入。从这里也可以看出CtrlD和换行符分别作为行结束符时输出的不同结果。EOF的作用也可以总结为当终端有字符输入时CtrlD产生的EOF相当于结束本行的输入将引起getchar()新一轮的输入当终端没有字符输入或者可以说当getchar()读取新的一次输入时输入CtrlD此时产生的EOF相当于文件结束符程序将结束getchar()的执行。字符都会缓冲在键盘缓冲器中直到回车换行一次性将所有字符按序依次赋给相应的变量在这里一定要注意最后一个字符即\n该字符也会赋给一个相应的变量当然这要你定义的用来接收字符的变量数比你输入的可见字符多一才可以。其实getchar()最典型的程序也就几行代码而已。本人所用的环境是DebianGNU/Linux在其他系统下也一样。一、getchar的两点总结1.getchar是以行为单位进行存取的。当用getchar进行输入时如果输入的第一个字符为有效字符(即输入是文件结束符EOFWindows下为组合键CtrlZ Unix/Linux下为组合键CtrlD)那么只有当最后一个输入字符为换行符\n(也可以是文件结束符EOFEOF将在后面讨论)时 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函数除了返回终端输入的字符外在遇到CtrlD(Linux下)即文件结束符EOF时getchar ()的返回EOF这个EOF在函数库里一般定义为-1。因此在这种情况下getchar函数返回一个负值把一个负值赋给一个char型的变量是不正确的。为了能够让所定义的变量能够包含getchar函数返回的所有可能的值正确的定义方法如下(KR C中特别提到了这个问题)int c;c getchar();二、EOF的两点总结(主要指普通终端中的EOF)1.EOF作为文件结束符时的情况EOF虽然是文件结束符但并不是在任何情况下输入CtrlD(Windows下CtrlZ)都能够实现文件结束的功能只有在下列的条件下才作为文件结束符。(1)遇到getchar函数执行时要输入第一个字符时就直接输入CtrlD就可以跳出getchar(),去执行程序的其他部分(2)在前面输入的字符为换行符时接着输入CtrlD(3)在前面有字符输入且不为换行符时要连着输入两次CtrlD这时第二次输入的CtrlD起到文件结束符的功能至于第一次的CtrlD的作用将在下面介绍。其实这三种情况都可以总结为只有在getchar()提示新的一次输入时直接输入CtrlD才相当于文件结束符。2.EOF作为行结束符时的情况这时候输入CtrlD并不能结束getchar(),而只能引发getchar()提示下一轮的输入。这种情况主要是在进行getchar()新的一行输入时当输入了若干字符(不能包含换行符)之后直接输入CtrlD此时的CtrlD并不是文件结束符而只是相当于换行符的功能即结束当前的输入。以上面的代码段为例如果执行时输入abc然后CtrlD程序输出结果为abcabc注意:第一组abc为从终端输入的然后输入CtrlD就输出第二组abc同时光标停在第二组字符的c后面,然后可以进行新一次的输入。这时如果再次输入CtrlD则起到了文件结束符的作用结束getchar。如果输入abc之后然后回车输入换行符的话则终端显示为abc //第一行带回车abc //第二行//第三行其中第一行为终端输入第二行为终端输出光标停在了第三行处等待新一次的终端输入。从这里也可以看出CtrlD和换行符分别作为行结束符时输出的不同结果。EOF的作用也可以总结为当终端有字符输入时CtrlD产生的EOF相当于结束本行的输入将引起getchar()新一轮的输入当终端没有字符输入或者可以说当getchar()读取新的一次输入时输入CtrlD此时产生的EOF相当于文件结束符程序将结束getchar()的执行。