zoukankan      html  css  js  c++  java
  • c程序设计语言_习题1-18_删除输入流中每一行末尾的空格和制表符,并删除完全是空格的行

     

    Write a program to remove all trailing blanks and tabs from each line of input, and to delete entirely blank lines.


    其实做这道题目有两种思路:

      1.后向模式:利用getline()先将输入流中,每一行完全接收,然后从接收的line字符串中末尾,往前扫,直到发现第一个非空格和制表符字符;

      2.前向模式:每接收一个字符,都要进行输出、判断。

    /* K&R2 1-18 p31: Write a program to remove trailing blanks and tabs
       from each line of input, and to delete entirely blank lines.
    
       The program specification is ambiguous: does "entirely blank lines"
       mean lines that contain no characters other than newline, or does
       it include lines composed of blanks and tabs followed by newline?
       The latter interpretation is taken here.
    
       This implementation does not use any features not introduced in the
       first chapter of K&R2.  As a result, it can't use pointers to
       dynamically allocate a buffer to store blanks that it has seen, so
       it must limit the number of blanks that are allowed to occur
       consecutively.  (This is the value of MAXQUEUE, minus one.)
    
       It is intended that this implementation "degrades gracefully."
       Even though a particular input might have 1000 or more blanks or
       tabs in a row, causing a problem for a single pass, multiple passes
       through the file will correct the problem.  The program signals the
       need for such an additional pass by returning a failure code to the
       operating system.  (EXIT_FAILURE isn't mentioned in the first
       chapter of K&R, but I'm making an exception here.) */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXQUEUE 1001
    
    int advance(int pointer)
    {
      if (pointer < MAXQUEUE - 1)
        return pointer + 1;
      else
        return 0;
    }
    
    int main(void)
    {
      char blank[MAXQUEUE];
      int head, tail;
      int nonspace;
      int retval;
      int c;
    
      retval = nonspace = head = tail = 0;
      while ((c = getchar()) != EOF) {
        if (c == '
    ') {
          head = tail = 0;
          if (nonspace)
            putchar('
    ');
          nonspace = 0;
        }
        else if (c == ' ' || c == '	') {
       
      //能执行这个if,只能说明输入行中字符溢出了。
      
    if (advance(head) == tail) { putchar(blank[tail]); tail = advance(tail); nonspace = 1; retval = EXIT_FAILURE; }
        //只要遇到空格和制表符,就先存起来 blank[head]
    = c; head = advance(head); } else {

        //一次性把前面积攒的空格和制表符输出来
    while (head != tail) { putchar(blank[tail]); tail = advance(tail); } putchar(c); nonspace = 1; } } return retval; }




    Chris Sidi writes:

    Ben,
    
    I thought your solution to 1-18 was really neat (it didn't occur to me
    when I was doing the exercise), the way it degrades gracefully and
    multiple passes can get rid of huge blocks of whitespace.
    
    However, if there is a huge block of non-trailing whitespace (eg "A",2000
    spaces, "B
    ") your program returns an error when there's not a need for
    it.  And if someone were to use your program till it passes it will loop
    infinitely:
    
      $ perl -e 'print "A"," "x2000,"B
    ";' > in
      $ until ./a.out < in > out; do echo failed, running another pass; cp out
         in; done
      failed, running another pass
      failed, running another pass
      failed, running another pass
      [snip]
    
    Below I have added a variable spaceJustPrinted to your program and check
    to see if the spaces printed early are trailing.  I hope you like the
    minor improvement.  (Though I can understand if you don't give a [1] :))
    

    [1] expletive deleted - RJH.

    /* K&R2 1-18 p31: Write a program to remove trailing blanks and tabs
       from each line of input, and to delete entirely blank lines.
    
       The program specification is ambiguous: does "entirely blank lines"
       mean lines that contain no characters other than newline, or does
       it include lines composed of blanks and tabs followed by newline?
       The latter interpretation is taken here.
    
       This implementation does not use any features not introduced in the
       first chapter of K&R2.  As a result, it can't use pointers to
       dynamically allocate a buffer to store blanks that it has seen, so
       it must limit the number of blanks that are allowed to occur
       consecutively.  (This is the value of MAXQUEUE, minus one.)
    
       It is intended that this implementation "degrades gracefully."
       Even though a particular input might have 1000 or more trailing
       blanks or tabs in a row, causing a problem for a single pass,
       multiple passes through the file will correct the problem.  The
       program signals the need for such an additional pass by returning a
       failure code to the operating system.  (EXIT_FAILURE isn't mentioned
       in the first chapter of K&R, but I'm making an exception here.) */
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXQUEUE 1001
    
    int advance(int pointer)
    {
      if (pointer < MAXQUEUE - 1)
        return pointer + 1;
      else
        return 0;
    }
    
    int main(void)
    {
      char blank[MAXQUEUE];
      int head, tail;
      int nonspace;
      int retval;
      int c;
      int spaceJustPrinted; /*boolean: was the last character printed whitespace?*/
    
      retval = spaceJustPrinted = nonspace = head = tail = 0;
    
      while ((c = getchar()) != EOF) {
        if (c == '
    ') {
          head = tail = 0;
          if (spaceJustPrinted == 1) /*if some trailing whitespace was printed...*/
            retval = EXIT_FAILURE;
    
          if (nonspace) {
            putchar('
    ');
            spaceJustPrinted = 0; /* this instruction isn't really necessary since
                                  spaceJustPrinted is only used to determine the
                                  return value, but we'll keep this boolean
                                  truthful */
            nonspace = 0;  /* moved inside conditional just to save a needless
                           assignment */
          }
        }
        else if (c == ' ' || c == '	') {
          if (advance(head) == tail) {
            putchar(blank[tail]); /* these whitespace chars being printed early
                                  are only a problem if they are trailing,
                                  which we'll check when we hit a 
     or EOF */
            spaceJustPrinted = 1;
            tail = advance(tail);
            nonspace = 1;
          }
    
          blank[head] = c;
          head = advance(head);
        }
        else {
          while (head != tail) {
            putchar(blank[tail]);
            tail = advance(tail);
          }
          putchar(c);
          spaceJustPrinted = 0;
          nonspace = 1;
        }
      }
    
      /* if the last line wasn't ended with a newline before the EOF,
      we'll need to figure out if trailing space was printed here */
      if (spaceJustPrinted == 1) /*if some trailing whitespace was printed...*/ 
        retval = EXIT_FAILURE;
    
      return retval;
    }



  • 相关阅读:
    ci
    RN开发杂记
    ‘100%’wuxiao
    Statezhong shiyong redux props
    assemble、compile、make、build和rebuild的关系
    promise
    React Native 通过navigation实现页面间传值
    react native redux
    js中 === 整形和字符串比较
    React Native 中使用Redux
  • 原文地址:https://www.cnblogs.com/haore147/p/3648256.html
Copyright © 2011-2022 走看看