C标准输入输出库

这样的代码有什么问题?
         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。 

转载于:https://www.cnblogs.com/little-white/p/3593471.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值