文档章节

C Primer Plus 第8章 字符输入/输出和输入确认 8.5 创建更友好的界面

idreamo
 idreamo
发布于 2016/06/29 06:27
字数 990
阅读 72
收藏 1

8.5.1 使用缓冲输入

问题在于缓冲输入需要您按下回车键来提交您的输入。这一动作还传输一个程序必须处理的换行符。您必须使程序至少能够处理这种情况 。

程序清单8.4 guess.c程序

/*guess.c--一个低效且错误的猜数程序*/
#include <stdio.h>
int main (void)
{
    int guess=1;
    char response;  /*添加一个char变量存储响应*/
    printf("Pick an integer from 1 to 100.I will try to guess ");
    printf("it.\nRespond with a y if my guess is right and with");
    printf("\nan n if it is wrong.\n");
    printf("uh...is your number %d?\n",guess);
    while ((response = getchar())!='y')  /*获取用户响应并和y进行比较*/
    {
        if (response=='n')  /*if else 来区别字符n和以个的字符*/
            printf("Well,then,is it %d\n",++guess);
        else
            printf("Sorry,I understand only y or n.\n");
        while (getchar()!='\n')    /*跳过输入的其他部分,包括换行符*/
            continue;
    }
    printf("I knew I cloud do it !\n");
    return 0;
}

8.5.2 混合输入数字和字符

getchar()读取每个字符,包括空格、制表符和换行符;而scanf()在读取数字时则会跟过空格 、制表符和换行符。

程序清单 8.5 showchar1.c

/*showchar1.c--带有一个较大的I/O问题的程序*/
#include <stdio.h>
void display(char cr,int lines ,int width);
int main (void)
{
    int ch ;  /*要打印的字符*/
    int rows,cols;  /*行数和列数*/
    printf("Enter a character and two integers; \n");
    while ((ch=getchar())!='\n')
    {
        scanf("%d %d",&rows,&cols);
        display(ch,rows,cols);
        printf("Enter another character and two integers; \n");
        printf("Enter a newlines to quit. \n");
    }
    printf("Bye.\n");
    return 0;
}
void display(char cr,int lines,int width)
{
    int row,col;
    for(row=1;row<=lines;row++)
    {
        for(col=1;col<=width;col++)
            putchar(cr);
        putchar('\n');  /*结束本行,开始新一行*/
    }
}

该程序开始时表现很好。您输入c 2 3,程序就如期打印2行c字符,每行3个。然后该程序提示输入第二组数据,并在您还没有能做出响应之前就退出了。哪里出错了呢?又是换行符,这次是紧跟在第一个输入行的3后面的那个换行符。scanf()函数将该换行符留在了输入队列中。与scanf()不同,getchar()并不跳过该换行符。所以在循环的下一个周期,在您有机会输入任何其他内容之前,这一换行符由getchar()读出,然后将其赋值给ch,而ch为换行符正是循环终止的条件。

要解决这一问题,该程序必须跳过一个输入周期中键入的最后一个数字与下行开始处键入的字符之间的所有推行符或空格 。另外,如果getchar()判断之外还可以在scanf()阶段终止该程序,则会更好。

程序清单8.6  showchar2.c程序

/*showchar1.c--带有一个较大的I/O问题的程序*/
#include <stdio.h>
void display(char cr,int lines ,int width);
int main (void)
{
    int ch ;  /*要打印的字符*/
    int rows,cols;  /*行数和列数*/
    printf("Enter a character and two integers; \n");
    while ((ch=getchar())!='\n')
    {
        if(scanf("%d %d",&rows,&cols)!=2)
            break;    /*在scanf()阶段添加判断终止循环*/
        display(ch,rows,cols);
        while(getchar()!='\n')
            continue;    /*跳过输入的剩余部分,包括换行符*/
        printf("Enter another character and two integers; \n");
        printf("Enter a newlines to quit. \n");
    }
    printf("Bye.\n");
    return 0;
}
void display(char cr,int lines,int width)
{
    int row,col;
    for(row=1;row<=lines;row++)
    {
        for(col=1;col<=width;col++)
            putchar(cr);
        putchar('\n');  /*结束本行,开始新一行*/
    }
}

while语句使程序剔除scanf()输入后的所有字符,包括换行符。这样就让循环准备好读取下一行开始的第一个字符。这意味着您可以自由地输入数据。

通过使用一个if语句和一个break,如果scanf()的返回值不是2,您就中止了程序。这种情况在有一个或两个输入值不是整数或者遇到文件尾时发生。

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
C Primer Plus(5版)第8章编程题1_重定向实现

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” 一、题目描述 本题是第8章编程题的第一道题,题目如下: 二、题目及思路分析 从题述来看...

石家的鱼
2017/07/11
0
0
C Primer Plus 第8章 字符输入/输出和输入确认 8.7 菜单浏览

8.7.1 任务 我们来更具体的考虑菜单程序需要执行的任务。该程序需要获取用户的响应,并且需要基于该响应选择一系列的动作。而且,程序还应该提供一种方法让用户可以回到菜单以做更多的选择。...

idreamo
2016/07/02
360
1
C Primer Plus 第8章 字符输入/输出和输入确认 8.3 重定向和文件

输入和输出涉及到函数、数据和设备。例如,考虑echo_eof.c程序。该程序使用了输入函数getchar()、输入设备(我们已经假设)是键盘,输入数据流由单独的字符组成。假设您希望保持相同的输入函...

idreamo
2016/06/28
166
0
C Primer Plus (第六版) 中文版 随手笔记(七)

版权声明: https://blog.csdn.net/qq_38351824/article/details/80073244 声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺...

sumjess
2018/04/25
0
0
C Primer Plus(5版)第8章习题讲解(三)

小伙伴们,对C语言编程有疑问的,可以加微信交流:poo_poo或者扫描我的头像,验证时请注明是“知友” 第8章的复习题还剩下6、7、8三题没有讲解了。本文讲下第6、8题,第7题先不讲了。 1. 第6...

石家的鱼
2017/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【0911】linux软件包安装和卸载

【0911】linux软件包安装和卸载 一、安装软件包的三种方法 1、rpm工具:与win中的exe安装包类似,红帽子公司包管理系统 2、yum工具:属于一种用python开发的工具,支持自动的安装依赖的包 3、...

飞翔的竹蜻蜓
18分钟前
3
0
【外行学IT】手机网页自适应之rem和viewport

在写手机网页时,对于像素的问题会非常困惑,初学者很多时候会因为那么一个小点的问题解决不了,或者无法理解透彻就放弃了学习。 我在学习写手机网页时也困惑了许久,出现过下面的问题: 图片...

前端老手
29分钟前
5
0
三、Java设计模式之单一职责原则

定义:不要存在多于一个导致类变更的原因。 一个类、接口、方法只负责一项职责 优点:降低类的复杂度、提高类的可读性,提高系统的可维护性、降低变更引起的风险

东风破2019
36分钟前
4
0
搭建高可用MongoDB集群(分片)

搭建高可用MongoDB集群(分片) KaliArch关注1人评论28269人阅读2017-12-04 21:57:41 MongoDB基础请参考:https://blog.51cto.com/kaliarch/2044423 MongoDB(replica set)请参考:https:/...

linjin200
56分钟前
6
0
Pandas DataFrame创建方法大全

Pandas是Python的数据分析利器,DataFrame是Pandas进行数据分析的基本结构,可以把DataFrame视为一个二维数据表,每一行都表示一个数据记录。本文将介绍创建Pandas DataFrame的6种方法。 创建...

汇智网教程
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部