c程序设计语言_习题1-9_将输入流复制到输出流,并将多个空格过滤成一个空格...

  Write a program to copy its input to its output, replacing each string of one or more blanks by a single blank.

  编写这样一个程序,实现将输入流复制到输出流,但是要将输入流中多个空格过滤成一个空格。 


1.旗帜变量方法

#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); } } /* We haven't met 'else' yet, so we have to be a little clumsy */ if(c != ' ') { inspace = 0; putchar(c); } } return 0; }


2.保存上一个输入字符

Chris Sidi writes: "instead of having an "inspace" boolean, you can keep track of the previous character and see if both the current character and previous character are spaces:"
Chris Sidi 写道:“我们可以不用‘inspace’这样一个布尔型旗帜变量,通过跟踪判断上一个接收字符是否为空格来进行过滤。”

 
#include <stdio.h>
 
/* count lines in input */
int
main()
{
        int c, pc; /* c = character, pc = previous character */
 
        /* set pc to a value that wouldn't match any character, in case
        this program is ever modified to get rid of multiples of other
        characters */
 
        pc = EOF;
 
        while ((c = getchar()) != EOF) {
                if (c == ' ')
                        if (pc != ' ')   /* or if (pc != c) */ 
                                putchar(c);
 
                /* We haven't met 'else' yet, so we have to be a little clumsy */
                if (c != ' ')
                        putchar(c);
                pc = c;
        }
 
        return 0;
}


3.利用循环进行过滤

Stig writes: "I am hiding behind the fact that break is mentioned in the introduction"!

 
#include <stdio.h>
 
int main(void)
{
        int c;
        while ((c = getchar()) != EOF) {
                if (c == ' ') {
                       putchar(c);
                       while((c = getchar()) == ' ' && c != EOF)
                               ;
               }
               if (c == EOF)
                       break; /* the break keyword is mentioned
                               * in the introduction... 
                               * */
 
               putchar(c);
        }
        return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值