c语言换行怎么操作(C语言中,如何getchar如何处理\n换行的问题?)

c语言换行怎么操作(C语言中,如何getchar如何处理\n换行的问题?)

大部分人偶尔会写一些中看不中用的程序。还好,C提供了大量工具让输入更顺畅,处理过程更顺利。不过,学习这些工具会导致新的问,比如printf与scanf的快捷形式putchar与getchar。

1.使用缓冲输入

缓冲输入用起来比较方便,因为在把输入发送给程序之前,用户可以编辑输入。但是,在使用输入的字符时,它也会给程序员带来麻烦。前面示例中看到的问题是,缓冲输入要求用户按下Enter键发送输入。这一动作也传送了换行符,程序必须妥善处理这个麻烦的换行符。我们以一个猜谜程序为例。用户选择一个数字,程序猜用户选中的数字是多少。该程序使用的方法单调乏味,先不要在意算法,我们关注的重点在输入和输出。下面是猜谜程序的最初版本,后面我们会改进。

/* guess.c -- an inefficient and faulty number-guesser */
#include <stdio.h>
int main(void)
{
    int guess = 1;

    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 (getchar() != 'y')      /* get response, compare to y */
        printf("Well, then, is it %d?\n", ++guess);
    printf("I knew I could do it!\n");

    return 0;
}

下面是程序的运行示例:

Pick an integer from 1 to 100. I will try to guess it.

Respond with a y if my guess is right and with

an n if it is wrong.

Uh…is your number 1?

n

Well, then, is it 2?

Well, then, is it 3?

n

Well, then, is it 4?

Well, then, is it 5?

y

I knew I could do it!

撇开这个程序糟糕的算法不谈,我们先选择一个数字。注意,每次输入n时,程序打印了两条消息。这是由于程序读取n作为用户否定了数字1,然后还读取了一个换行符作为用户否定了数字2。

一种解决方案是,使用while循环丢弃输入行最后剩余的内容,包括换行符。这种方法的优点是,能把no和no-way这样的响应视为简单的n。而第一个版本会把no当作两个响应。下面用循环修正这个问题:

while (getchar() != 'y')   /* get response, compare to y */
{
    printf("Well, then, is it %d?n", ++guess);
    while (getchar() != '\n')
        continue;          /* skip rest of input line    */
}

下面是程序的运行示例:

Pick an integer fromxs 1 to 100. I will try to guess it.
Respond with a y if my guess is right and with
an n if it is wrong.
Uh...is your number 1?
n
Well, then, is it 2?
no
Well, then, is it 3?
no sir
Well, then, is it 4?
forget it
Well, then, is it 5?
y
I knew I could do it

这的确是解决了换行符的问题。但是,该程序还是会把f视为n。我们用if语句筛选其他响应。首先,添加一个char类型的变量存储响应:

: char response;

修改后的循环如下:

现在,程序的运行示例如下:

while ((response = getchar()) != 'y')     /* get response */
{
   if (response == 'n')
      printf("Well, then, is it %d?n", ++guess);
   else
      printf("Sorry, I understand only y or n.n");
   while (getchar() != 'n')
      continue;                 /* skip rest of input line */
}

在编写交互式程序时,应该事先预料到用户可能会输入错误,然后设计程序处理用户的错误输入。在用户出错时通知用户再次输入。当然,无论你的提示写得多么清楚,总会有人误解,然后抱怨这个程序设计得多么糟糕。

2 混合数值和字符输入

假设程序要求用getchar()处理字符输入,用scanf()处理数值输入,这两个函数都能很好地完成任务,但是不能把它们混用。因为getchar()读取每个字符,包括空格、制表符和换行符;而scanf()在读取数字时则会跳过空格、制表符和换行符。

我们通过程序清单8.5来解释这种情况导致的问题。该程序读入一个字符和两个数字,然后根据输入的两个数字指定的行数和列数打印该字符。

/* showchar1.c -- program with a BIG I/O problem */
#include <stdio.h>
void display(char cr, int lines, int width);
int main(void)
{
    int ch;             /* character to be printed    */
    int rows, cols;     /* number of rows and columns */
    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 newline 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');  /* end line and start a new one */
    }
}

注意,该程序以int类型读取字符(这样做可以检测EOF),但是却以char类型把字符传递给display()函数。因为char比int小,一些编译器会给出类型转换的警告。可以忽略这些警告,或者用下面的强制类型转换消除警告:

display(char(ch), rows, cols);

在该程序中,main()负责获取数据,display()函数负责打印数据。下面是该程序的一个运行示例,看看有什么问题:

Enter a character and two integers:

c 2 3

ccc

ccc

Enter another character and two integers;

Enter a newline to quit.

Bye.

该程序开始时运行良好。你输入c 2 3,程序打印c字符2行3列。然后,程序提示输入第2组数据,还没等你输入数据程序就退出了!这是什么情况?又是换行符在捣乱,这次是输入行中紧跟在3后面的换行符。scanf()函数把这个换行符留在输入队列中。和scanf()不同,getchar()不会跳过换行符,所以在进入下一轮迭代时,你还没来得及输入字符,它就读取了换行符,然后将其赋给ch。而ch是换行符正式终止循环的条件。

要解决这个问题,程序要跳过一轮输入结束与下一轮输入开始之间的所有换行符或空格。另外,如果该程序不在getchar()测试时,而在scanf()阶段终止程序会更好。修改后的版本如下。

/* showchar2.c -- prints characters in rows and columns */
#include <stdio.h>
void display(char cr, int lines, int width);
int main(void)
{
    int ch;             /* character to be printed      */
    int rows, cols;     /* number of rows and columns   */

    printf("Enter a character and two integers:n");
    while ((ch = getchar()) != 'n')
    {
        if (scanf("%d %d",&rows, &cols) != 2)
            break;
        display(ch, rows, cols);
        while (getchar() !=  'n')
            continue;
        printf("Enter another character and two integers;n");
        printf("Enter a newline 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');  /* end line and start a new one */
    }
}

while循环实现了丢弃scanf()输入后面所有字符(包括换行符)的功能,为循环的下一轮读取做好了准备。该程序的运行示例如下:

Enter a character and two integers:
c 1 2
cc
Enter another character and two integers;
Enter a newline to quit.
! 3 6
!!!!!!
!!!!!!
!!!!!!
Enter another character and two integers;
Enter a newline to quit.

Bye.

在if语句中使用一个break语句,可以在scanf()的返回值不等于2时终止程序,即如果一个或两个输入值不是整数或者遇到文件结尾就终止程序。

n

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至19401980@qq.com举报,一经查实,本站将立刻删除。

(0)

大家都在看

  • epic平台怎么使用详细介绍

    epic大会员可以享受可以享受游戏折扣和一系列优惠开通epic免费会员就会有每周会员免费游戏玩,Epic平台是类似steam的游戏平台,此平台原本只是堡垒之夜的启动器,现逐渐转变为EPIC Games旗下的衍生游戏平台该平台近年经过不断;epic锁国区怎么买游戏是很多玩家想要了解的,好玩的游戏买不了还是很难受的,这里就给大家带来有关epic锁国区怎么买游戏的…

    2023年4月25日
    0250
  • oppo手机怎么清理内存垃圾清理

    很多朋友多说OPPO手机用久了会比较卡,其实手机卡顿通常就是内存不足导致的。因为很多人不会清理手机垃圾,时间一长就会导致内存不足,而后手机自然就会变的卡顿。今天就给大家分享几招,清理OPPO手机内存和减少占用手机内存的方法。 一、 清理内存的方法 1. 卸载无用软件 现在的手机软件,因为功能越来越强大,所以它占用的体积也在变大。相信每个人手机里都有一些,没用…

    2023年5月25日
    0170
  • 联想笔记本拯救者r9000p首发是什么时候

    国行的R9000P发售时间还没有发布,但是国外的版本电脑已经在2022年1月发售了根据2022年 1 月 6 日消息,联想 Global 发布了 Legion 5i Pro 和 Legion 5 Pro 笔记本,分别对应国内的 Y9000P R9000P 型号Legion。 联想拯救者2021年5月25日宣布,拯救者 R9000P 冰魄白将于2021年夏季新…

    2023年4月16日
    0570
  • 苹果iPhone手机自带翻译功能怎么用 苹果iPhone手机自带翻译功能使用方法【详解】

      很多朋友在手机上浏览国外网站都会遇到这样的问题:只能读懂简单的英文的单词,并不能完整读懂整个文章的意思。   英文基础较差的用户遇到英文资讯怎么办?   其实苹果手机自带网页翻译神器,只不过很少有人发现怎么使用,下面就教大家 如何用 iPhone手机翻译英文 。   大家在用苹果手机浏览器外国网站时,都会遇到看不懂的英文单词,这时大家都会通过复制单词上网…

    2023年5月17日
    0190
  • 企业微信公告怎么删除

    企业微信“班级空间”的通知删除方法如下微信与企业微信互通后,员工不止可以通过微信加入企业微信,也可以在微信中查看企业微信的消息,只要关注了微信插件即可我们点击微信中的企业微信消息,进入插件,在页面右上角的_号中。 设置权限了企业微信有权限设置,管理员没有给你删除的权限可以联系企业管理员索要权限。 1首先在微信群长按群公告,点击删除2然后在打开的窗口中,再次点…

    2023年4月15日
    0370
  • 杰克a3缝纫机六个按键

    1、方向上键:向上移动光标。 2、方向下键:向下移动光标。 3、SOURCE键:确定功能。 4、AUTO键:激活显示器自动调整功能。 5、ON/OFF:显示器开关按键,打开或关闭显示器。 6、MENU:用于调出显示器OSD菜单,即包含所有对显示画面进行调整的参数权的菜单。 电脑缝纫机应用了电脑解剖,从机壳的结构到每个零件的细小部位均实现了最优化设计。由此,它…

    2023年3月18日
    0510

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注