C Primer Plus(5版)第8章习题讲解(三)

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友”

第8章的复习题还剩下6、7、8三题没有讲解了。本文讲下第6、8题,第7题先不讲了。

1. 第6题

4232298-aeb327b40c25f554.png
image

(a) 例子:

当输入完题中要求的字符串,并且按下回车后,此时缓冲区中的数据是“If you quit,I will.\n”,注意,输入的字符串后还有一个换行符,一起送给getchar函数读取。代码规定,遇到字符'i'就停止输出,所以最终输出的结果如下:

4232298-5a4fd161bd1106e1.png
image

(b)例子:

这个例子使用了自增运算符,比较复杂一点。当输入完题中要求的字符串,并且按下回车后,此时缓冲区中的数据是“Harhar\n”,注意,输入的字符串后还有一个换行符,一起送给getchar函数读取。代码规定,遇到字符'\n'就停止输出。

再来看while循环中的第一个putchar(ch++);

++运算符在后面,意思是“先用后增”。所谓的先用,就是先把ch输出,是字符'H';所谓的后增,就是输出完了,ch再自己加1,也就是字符'H'加1后就是字符'I'。

再来看第二个putchar(++ch);

这次++运算符在前面,意思是“先增后用”。所谓的先增,就是把ch加1,也就是字符'I'加1变成字符'J',所谓的后用,就是把ch输出,此时就输出字符'J'了。后续的字符都可以这样来推算。最终运行结果如下:

4232298-0d182ca33e132be2.png
image

2. 第8题

4232298-0c1da26421133df7.png
image

这道题很有意思,也是很多初学者会遇到的很奇怪的现象。我编写一个程序,如下:

#include <stdio.h>

int main(void)
{
    int number;
    char ch;
    char temp;

    puts("Please input a number");
    scanf("%d", &number);

        /*
    while( (temp = getchar()) != '\n' )
    {
        continue;
    }
        */  
    puts("Please input a char");
    ch = getchar();

    printf("the number is %d, the char is %c\n", number, ch);

    return 0;
}

代码要求先输入一个整数,再输入一个字符,最后将这个整数和字符一起输出。

在运行时,我先输入一个整数12,然后按下回车键,准备再输入一个字符,可是程序没给我输入的机会,程序就结束了!如下所示:

4232298-04fcb79be94bc829.png
image

问题出在哪儿?

原来,在我输入完整数之后,我按下了回车键,此时,换行符连同整数12一起送给scanf函数。可是scanf函数只要整数12,不要换行符,换行符还在缓冲区中。下一次调用getchar函数时,getchar就把换行符读取了,所以最终的输出结果就是整数12和一个换行符。

解决的方法,就是把这个换行符清掉,只需要去掉注释部分即可。注释的代码会读取整数12后面的字符,一直到读取到一个换行符为止。这样就把缓冲区中的数据全部处理完毕,留下一个空的缓冲区给getchar函数了。运行结果如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言答疑课堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值