这样的代码有什么问题?
char c;
while((c = getchar()) != EOF) ...

首先,保存getchar的返回值的变量必须是int型。EOF是getchar返回的“超出范围”的

特殊值,它跟getchar可能返回的其他任何字符值都不一样。(在时新的系统上,文件中已经不再保存真正的文件结束符了,EOF只不过是一个没有更多字符的信号而已。)getchar返 回的值必须保存在一个比char型大的变量中,这样才能保存所有的char值和EOF。

像前面的代码片段那样将getchar的返回值赋给char可能产生两种失败情况。

(1) 如果char型有符号而EOF(像通常那样)定义为-1,则十进制值为255的字符 ('\377'或'\Xff')会被符号扩展,跟EOF比较的时候会相等,从而过早地结束输入。

(2) 如果char型无符号,则EOF会被截断(扔掉最高位,可能变成255或0xff)而不再 被识别为EOF,从而导致无休止的输入2。

然而,如果char型有符号而输入的又都是7位的字符,则这个错误可能持续很长时间而 不被发现。(普通char型是否有符号由实现定义。)

问:我有个读取直到EOF的简单程序,但是我如何才能在键盘上输入那个“\EOF”呢?我看 <stdio.h>中定义的EOF是-1,是不是说我该输入-1?

答:考虑一下就知道,你输入的绝不能是-1,因为-1是两个字符,而getchar每次读入一个字

符。事实上,在你的C程序中看到的EOF值和你在键盘上发出文件结束符的按键组合之间并没有

什么关系。EOF不过是向程序发出的一个信号,指明输入不再有任何字符了,不论什么原因(磁 盘文件结束、用户结束输入、网络流关闭和I/O错误等。)根据你的操作系统,你可能使用不同 的按键组合来表示文件结束,通常是Ctrl-D或Ctrl-Z。操作系统和标准输入输出库安排你的程序 接收EOF值。(然而请注意,这一路有好几个转换。通常情况下,你不能自己检查Ctrl-D或Ctrl-Z 值,你在stdio.h文件中也不会发现EOF宏定义成了这样的值。)

问:如何在printf的格式串中输出一个'%'字符?我试过\%,但是不行。

答:只需要重复百分号:%%。

用printf输出%之所以困难是因为%正是printf的转义字符。任何时候printf遇到%, 它都会等待下一个字符,然后决定如何处理。而双字符序列%%就被定义成了单独的%字符。 要理解为什么\%不行,得知道反斜杠\是编译器的转义字符,它控制编译器在编译时对源 代码中字符的解释。而这里我们的问题是printf如何在运行时控制它的格式串。在编译器 看来,\%可能没有定义或者代表一个%字符。就算printf会对\特殊处理,\和%在printf中

都有效的可能性也不大。

问:为什么scanf("%d", i)调用不行? 答:传给scanf的参数必须是指针:对于每个转换的值,scanf都会写入你传入的指针指向的位

置(参见问题20.1。)。改为scanf("%d", &i)即可修正上面的问题。

问:为什么这些代码不行? double d;

        scanf("%f", &d);

 

答:跟printf不同,scanf用%lf代表double型,用%f代表float型。1 %f格式告诉scanf准 备接收float型指针,而不是你提供的double型指针。要么使用%lf,要么将接收变量声明为

float。

C标准输入输出库的更多相关文章

  1. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  2. flockfile, ftrylockfile, funlockfile - 为标准输入输出锁定文件 FILE

    SYNOPSIS 总览 #include <stdio.h> void flockfile(FILE *filehandle); int ftrylockfile(FILE *fileha ...

  3. stdio - 标准输入输出库函数

    SYNOPSIS 总览 #include <stdio.h> FILE *stdin; FILE *stdout; FILE *stderr; DESCRIPTION 描述 标注 I/O ...

  4. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  5. 【转】C++标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  6. 【转载】标准输入输出重定向(Visual C++)

    原文:标准输入输出重定向(Visual C++) 引言 本人偶得在 Visual C++ 中进行输入输出重定向的办法,比通常的做法“freopen”更加的灵活和方便,特在此共享.目前,代码正在不断地摸 ...

  7. jsp标准标签库

    抄袭自:http://www.cnblogs.com/hongten/archive/2011/05/14/2046005.html JSP标准标签库     Pass by xkk ,and aut ...

  8. C++标准库和标准模板库

    转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标 ...

  9. C++标准库和标准模板库(转)

    转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标 ...

随机推荐

  1. 【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework 之优雅增删改

    [前言] 大家好,我是TANZAME.出乎意料的,我们在立冬的前一天又见面了,天气慢慢转凉,朋友们注意添衣保暖,愉快撸码.距离 TZM.XFramework 的首秀已数月有余,期间收到不少朋友的鼓励. ...

  2. 27 个问题突破所有重难点,BroadcastReceiver 、ContentProvider 知多少?「建议收藏」

    前言 距离上次更新过去一周多了,打破了之前两到三天一更的惯例,主要还是这部分内容太多了. 原先想把 BroadcastReceiver .ContentProvider 分两篇来总结,但的确,这两大组 ...

  3. winform 数据库资料导出Excel方法(适用于资料数据较多加载慢,不用呈现至DatagridView)

    Private Sub savefile(ByVal dgv2 As DataTable) Dim app As Object = CreateObject("Excel.Applicati ...

  4. OV5640摄像头的数据处理配置流程(一)

    module RGB_init( //系统信号输入(时钟+复位) input cmos_clk_i, //模块控制时钟 input rst_n_i, //系统复位信号 //OV5640输出信号(从56 ...

  5. Ubuntu18.04系统下安装Pycharm&vim设置自动缩进及默认显示行号

    Ubuntu18.04系统自带python3.6及python2.7,Pycharm是一款非常强大的IDE.目前Pycharm有两个版本:专业版和Community社区,区别是专业版是收费,而且功能更 ...

  6. nginx篇最初级用法之地址重写

    nginx服务器的地址重写,主要用到的配置参数是rewrite rewrite regex replacement flag rewrite 旧地址 新地址 [选项] 支持的选项有: last 不再读 ...

  7. csps模拟测试70

    又炸了,T1没开$long long$,炸掉$50pts$,昨天因为SB错误挂掉$100pts$. 我kuku了,以后细心点吧.

  8. 在vue中如何使用axios

    1.前言 在Vue1.0的时候有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource. 关于为什么放弃推荐? -& ...

  9. 缓存管理之MemoryCache与Redis的使用

    一..MemoryCache介绍 MemoryCache是.Net Framework 4.0开始提供的内存缓存类,使用该类型可以方便的在程序内部缓存数据并对于数据的有效性进行方便的管理, 它通过在内 ...

  10. PyCharm安装及使用教程

    1  PyCharm下载 PyCharm的下载安装非常简单,可以直接到Jetbrains公司官网下载,具体步骤如下: (1)打开Pycharm官网http://www.jetbrains.com,选择 ...