K&R练习1-9(C)

MW2*_*000 19 c

"编写一个程序将其输入复制到其输出中,用一个空格替换一个或多个空格的每个字符串."

我假设他这意味着输入像...

我们(空白)(空白)(空白)(空白)(空白)(空白)(空白)(空白)商城!

...并输出如下:

我们(空白)(空白)(空白)(空白)商城!

这可能比我要做的更容易,但是,我似乎无法弄明白.我真的不想要代码...更多伪代码.

另外,我该怎么看?我很确定我编写的任何程序至少需要一个variable,一个while循环,几个if语句,并且将同时使用getchar()putchar()函数......但除此之外,我不知所措.我还没有一个程序员的思路,所以如果你能给我一些建议,我应该如何看待一般的"问题",这真是太棒了.

(请不要提起else,我还没有在书中那么远,所以现在这超出了我的范围.)

Mic*_*ler 22

将程序看作是在迭代输入时在不同状态之间移动的机器.

它一次读取输入的一个字符.如果它看到除空白之外的任何内容,它只会打印它看到的字符.如果它看到空白,则转换到不同的状态.在该状态下,它会打印一个空白,然后如果看到空白则不会打印空白.然后,它继续读取输入,但忽略它看到的所有空白 - 直到它击中一个不是空白的字符,此时它会转回到第一个状态.

(顺便说一句,这个概念被称为有限状态机,许多理论计算机科学工作已经进入他们能做什么和不能做什么.维基百科可以告诉你更多,虽然可能比你更复杂的细节寻找. ;))


Mat*_*ner 13

伪代码

while c = getchar:
    if c is blank:
        c = getchar until c is not blank
        print blank
    print c
Run Code Online (Sandbox Code Playgroud)

C

isblank如果您愿意,可以替换此处的使用.没有说明哪些字符设计为空白,或者用什么空白值代替其他字符打印.

在马修在下面的评论中提出的许多观点之后,这个版本和包含isblank的那个是相同的.

int c;
while ((c = getchar()) != EOF) {
    if (c == ' ') {
        while ((c = getchar()) == ' ');
        putchar(' ');
        if (c == EOF) break;
    }
    putchar(c);
}
Run Code Online (Sandbox Code Playgroud)

  • 有一点可能会有所帮助:如果您还不了解它,这可能是了解`ctype.h`的好时机.`ctype.h`包含用于确定`char`的"类型"的函数.也就是说,你可以用它来查看`char`是一个字母,一个数字,一个空格等等.如果它现在吸收太多,那么请记下以后再做一个心理记录,这样你就不会浪费时间重新发明轮. (4认同)
  • @ssbrewster:它的工作原理是因为内部`while`语句在打印一个空格之前会烧掉多余的空格. (2认同)

小智 5

由于C中的关系运算符产生整数值1或0(如本书前面所述),逻辑表达式"当前字符非空白或前一个字符非空白"可以使用整数运算进行模拟,从而缩短(如果有点神秘) )代码:

int c, p = EOF;
while ((c = getchar()) != EOF) {
    if ((c != ' ') + (p != ' ') > 0) putchar(c);
    p = c;
}
Run Code Online (Sandbox Code Playgroud)

变量p初始化,EOF以便在第一次比较期间具有有效的非空值.