首先给出《The_C_Programming_Language》这本书中的例子:

#include <stdio.h>

int main()
{
    int c;

    c = getchar();

    while (c != EOF)
    {
          putchar();

             c= getchar(); 

    }
    return 0;
}

这里主要解释下为什么要用int型来接受getchar函数。

很多时候,我们会写这样的两行代码:
char c;
c = getchar();
这样就很有可能出现问题。因为getchar函数除了返回终端输入的字符外,在遇到Ctrl+D(Linux下)即文件结束符EOF时,getchar ()的返回EOF,这个EOF在函数库里一般定义为-1。因此,在这种情况下,getchar函数返回一个负值,把一个负值赋给一个char型的变量是不正确的。

下面用一个题目来看其实如何获取字符和输出字符的。

#include "stdio.h"
main()
{
    char c,d,e,f;
    printf("please input two characters:\n");
    c=getchar();
    putchar(c);
    putchar('\n');
    d=getchar();
    putchar(d);
    putchar('\n');
    e=getchar();
    putchar(e);
    putchar('\n');
    f=getchar();
    putchar(f);
    putchar('\n');
    printf("c= %c\n",c);
    printf("d= %c\n",d);
    printf("e= %c\n",e);
    printf("f= %c\n",f);
}
运行后先输入“12”,回车,再输入“34”,回车。
运行环境是redhat gcc

运行结果:
please input two characters:
12
1
2

34
3
c=1
d=2
e=

f=3
下面具体解释一下:

getchar函数每次从缓冲区中得到一个字符,putchar函数每次输出一个字符。

首先输入了两个字符12,然后回车,注意这时写入缓存中的有3个字符1,2,回车。

程序中有四个getchar(),于是c='1',d='2',e='\n'。

这时运行到f=getchar();输入缓存中的三个字符均被前三个getchar获取,这时需要用户输入,

这里输入了34

于是f='3',4和后面的回车没有被利用。

这便是整个流程。

感谢:http://www.cnblogs.com/hdchild/archive/2009/11/19/1606457.html

C语言中的getchar和putchar详解的更多相关文章

  1. C语言中strtod()函数的用法详解

    函数原型: #include <stdlib.h> double strtod(const char *nptr, char **endptr); C语言及C++中的重要函数. 名称含义 ...

  2. 基于C语言EOF与getchar()的使用详解

    转自:http://www.jb51.net/article/36848.htm   大师级经典的著作,要字斟句酌的去读,去理解.以前在看K&R的The C Programming Langu ...

  3. Linux C 字符函数 getchar()、putchar() 与 EOF 详解

    首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main() { int c; c = getc ...

  4. C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符

    在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员 ...

  5. C语言中void*详解及应用

    void在英文中作为名词的解释为“空虚:空间:空隙”:而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”.void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为 ...

  6. C语言中file文件指针概念及其操作 (转载)

    文件 文件的基本概念 所谓"文件"是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件. ...

  7. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

  8. C语言中malloc()和calloc()c函数用法

    C语言中malloc()和calloc()c函数用法   函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...

  9. (七)C语言中的void 和void 指针类型

    许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...

随机推荐

  1. ajax请求超时时间

    http://www.cnblogs.com/charling/p/3356216.html get post 请求 http://www.cnblogs.com/oneword/archive/20 ...

  2. kafka - topic

    http://www.cnblogs.com/yurunmiao/p/5550906.html http://www.cnblogs.com/chushiyaoyue/p/5695826.html

  3. Open-falon监控安装过程

    Open-falon监控安装过程   具体参考:   http://book.open-falcon.org/zh/quick_install/prepare.html 1. 安装ntp.vim编辑器 ...

  4. container 的背后

    如果要看laravel的单个功能的源代码,首先去找对应得ServiceProvider,例如加密功能hash,则按一下步骤查看源代码: HashServiceProvider.php(主要是看regi ...

  5. 如何让div中的内容垂直居中

    虽然Div布局已经基本上取代了表格布局,但表格布局和Div布局仍然各有千秋,互有长处.比如表格布局中的垂直居中就是Div布局的一大弱项,不过好在千变万化的CSS可以灵活运用,可以制作出准垂直居中效果, ...

  6. onclick="test()"与onclick="return test()"的区别

    浏览器会对页面元素的某些操作产生默认行为比如a标签跳转,form表单的提交等如果是onclick="test()"则执行该函数,然后继续自己的默认行为 <a href=&qu ...

  7. DSP算法学习-过采样技术

    DSP算法学习-过采样技术 彭会锋 2015-04-27 23:23:47 参考论文: 1 http://wr.lib.tsinghua.edu.cn/sites/default/files/1207 ...

  8. [saiku] 优化多维度查询效率

    1.优化查询精度 优化原因:当维度过多时,查询很复杂,效率较慢.因此看能否通过优化sql的方式来提高查询效率. 代码跟踪查看(维度多余3时查询条件里面有in,优化不用in关键字) public abs ...

  9. EasyUI tab常用

    获取选中的tab的title var tab = $('#tab_Employee').tabs('getSelected'); var t=tab.panel('options').title; t ...

  10. MVC之视图的布局

      1. RenderBody  布局在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Layout.cshtml)放在了共享视图文件夹中.在这个页面中,会看到标签里有这样一条语句 ...