澄清K&R练习1-9

领域

我对此练习有一些疑问。这是我正在处理的代码:

#include <stdio.h>

int main (void)
{
    int c;
    int inspace;

    inspace = 0;
    while((c = getchar()) != EOF)
    {
        if(c == ' ')
        {
            if(inspace == 0)
            {
                inspace = 1;
                putchar(c);
            }
        }

        if(c != ' ')
        {
            inspace = 0;
            putchar(c);
        }
    }
    return 0;
}

(对不起,我很难理解这些程序的工作方式,因为它们是如此简单,并且缺乏关于其实际工作方式的描述)

首先,putchar(c)如何不输出与输入的数据完全相同的数据。尽管它检查是否为空或!=空,但仍然说要输出“ c”,它只是getchar(c),意味着输入了什么。我看不到指定删除多余空格并仅输出一个空格的代码。代码在哪里指定必须发生什么?我在理解getchar / putchar的工作方式时遇到了麻烦。

另外,inspace == 1或0有什么重要性?如果inspace == 1,则仅输出回退的字符。没什么好说的,多余的空格会被删除,并且inspace不会被定义为0或1以外的任何东西,也没有什么将其定义为空格,因此它怎么可能对程序正在做什么有真正的意义?

我真的很困惑,替换空格的代码在哪里,它是如何工作的?我应该从中学习一本更简单的书来解释解决方案吗?

约翰·库格曼

首先,putchar(c)如何不输出与输入的数据完全相同的数据。尽管它检查是否为空或!=空,但仍然说要输出“ c”,它只是getchar(c),意味着输入了什么。我看不到指定删除多余空格并仅输出一个空格的代码。代码在哪里指定必须发生什么?我在理解getchar / putchar的工作方式时遇到了麻烦。

正确的是,如果调用了putchar,则仅输出输入字符。该程序的关键是,并不是在每个输入字符上都调用putchar。各种if语句控制何时调用。在较高的级别上,如果一行中有多个空格,则该程序避免在第二,第三,第四等空格上调用putchar。它仅在第一个空间被调用。

另外,inspace == 1或0有什么重要性?如果inspace == 1,则仅输出回退的字符。没什么好说的,多余的空格会被删除,并且inspace不会被定义为0或1以外的任何东西,也没有什么将其定义为空格,因此它怎么可能对程序正在做什么有真正的意义?

不要认为它是删除空格可以认为它们被忽略了有时会调用putchar,有时不会。查看循环并尝试找出导致调用putchar的条件

重要的是,看看启动循环迭代inspace == 1,和会发生什么c == ' '怎么了?

汇总一张显示何时调用和不调用putchar的表可能会有所帮助。

Is putchar(c) called?
=====================

             | c == ' ' | c != ' '
-------------+----------+---------
inspace == 0 |    Y     |    Y
inspace == 1 |    N     |    Y

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C- K&R练习1-9

来自分类Dev

K&R练习1-9:第二个while循环条件说明

来自分类Dev

K&R练习1-9解决方案C编程

来自分类Dev

K&R练习1-9:输出输入,将多个空格替换为一个空格

来自分类Dev

K&R C练习4-9:为什么忽略EOF?

来自分类Dev

关于K&R的EX1-9

来自分类Dev

K&R的练习1-13

来自分类Dev

K&R练习1-14

来自分类Dev

K&R练习1-23

来自分类Dev

K&R 1-9 //在循环内部的循环中使用getchar

来自分类Dev

K&R练习1.21

来自分类Dev

K&R练习1-8改进

来自分类Dev

K&R练习4-3

来自分类Dev

K&R练习2-5

来自分类Dev

K&R练习4-3

来自分类Dev

K&R 1.19练习(“反向”功能)

来自分类Dev

atof练习(K&R第4.2节,练习4.2)

来自分类Dev

K&R练习1-20编程语言第二版

来自分类Dev

(练习1.6 K&R)如何验证getchar()!= EOF是0还是1?

来自分类Dev

K&R练习1-16-为什么我的解决方案不起作用?

来自分类Dev

K&R练习1-18的意外输出(C编程语言)

来自分类Dev

K&R练习6-1在某些情况下,getword函数无法读取EOF

来自分类Dev

C答案书中练习1-22(K&R)的解决方案

来自分类Dev

练习1-6:(第17页K&R)-getchar()问题

来自分类Dev

K&R练习1-18的意外输出(C编程语言)

来自分类Dev

有关C编程语言(K&R)的问题-练习1-13

来自分类Dev

(-1)^k 对于 R 中从 0 到 9 的每个 k

来自分类Dev

K&R 2第5.10节的澄清

来自分类Dev

K&R练习1.18(删除尾随空白)