zoukankan      html  css  js  c++  java
  • 【C语言学习趣事】_31_《C程序设计语言》_Secnod_Edition_习题

      最近一直看这本书,发现里面的习题真的太经典了,很多习题看是简单,但是要真正的做好,还真需要费很大的事。

    【习题1.10】

      

      这里我们先根据习题1.9的套路给出一个程序。

    /*
      本程序用来将输入的制表符、退格符显式输出,
    将反斜杠以"\\"的形式输出
    */
    
    #include <stdio.h>
    
    int main(int argc,char* argv[])
    {
        short int Input;
    
        while(EOF !=(Input=getchar()))
        {
            switch(Input)
            {
            case '\t':
                putchar('\\');
                putchar('t');
                break;
            case '\b':
                putchar('\\');
                putchar('b');
                break;
            case '\\':
                putchar('\\');
                putchar('\\');
                break;
            default:
                putchar(Input);
            }
        }
    
        return 0;
    }

      程序执行情况如下所示:

      这里有一个问题需要说明: 就是如何在终端输入'\b'字符。可以发现利用上面的程序我们无法输入退格字符。

      原因是: getchar()函数是从输入缓冲区读入字符的,而输入缓冲机制里面,Backspace键会将输入缓冲区栈顶的字符出栈,因此具有输入缓冲机制

    的库函数都不能实现 '\b' 字符的有效输入。

      解决方法是: 不通过输入缓冲区输入字符。在库函数中getch()函数可以达到这个目的。

      但是这样有一个新的问题,那就是getch()函数不能回显,还有就是getch()函数不能像getchar()函数一样输入Ctrl + Z 组合;

    这里就需要进行处理输入回显的问题。

       要点:这里需要说明一点,getch函数不是ANSI标准库里面的函数,标准库函数里面定义的是

    getc()函数。标准库里面有些符号是定义的宏,而且具有同名的函数。

      例如:getchar() 既有宏、也有函数。

      题外话:

      这里我们输入字符的时候,在换行的时候就输出了,有时可能需要一直输入,直到输入某个特定的字符才输出。这就需要

    修改了,那需要怎么办呢?

      我这里借助链表实现一直存储,然后整个的输入。

      链表的创建、插入、删除、查找和显示。

    /*
        本程序用来测试链表的基本操作
    */
    
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    
    typedef struct node
    {
        char chInput;
        struct node* next;
    }NODE;
    
    
    
    void CreateList(NODE* head);
    void EchoList(NODE* head);
    void InsertNode(NODE* head,char chPosition,char chElement);
    void DeleteNode(NODE* head,char chElement);
    NODE* SearchNode(NODE* head,char chElement);
    
    int main(int argc,char* argv[],char* env[])
    {
        NODE* head;
        NODE* FindNode;
        char chInput;
        
        head=(NODE *)malloc(sizeof(NODE));
        CreateList(head);
        EchoList(head);
    
        puts("Enter the charecter you want to search:");
        chInput=getchar();
        FindNode=SearchNode(head,chInput);
        if(NULL==FindNode)
            puts("Can not find the element");
        else
        {
            putchar(FindNode->chInput );
            putchar('\n');
            DeleteNode(head,chInput);
            EchoList(head);
        }
    
    
        getchar();
        getchar();
        return 0;
    }
    
    void CreateList(NODE* head)
    {
        NODE* end;
        NODE* temp;
    
        short int chInput;
    
        end=head;
    
        while((chInput=getchar())!=EOF)
        {
            end->chInput =chInput;
            temp=(NODE *)malloc(sizeof(NODE));
            temp->next =NULL;
            end->next =temp;
            end=temp;
        }
    }
    
    void EchoList(NODE *head)
    {
        NODE* temp;
    
        temp=head;
    
        while(temp->next != NULL)
        {
            putchar(temp->chInput);
            temp=temp->next ;
        }
    }
    
    NODE* SearchNode(NODE* head,char chElement)
    {
        NODE* temp;
    
        temp=head;
    
        //处理只有一个节点的情况
        if(temp->next ==NULL)
        {
            if(temp->chInput ==chElement)
                return temp;
            else 
                return NULL;
        }
    
        while(temp->next != NULL)
        {
            if(chElement == temp->chInput)
                break;
            else
                temp=temp->next ;
        }
            return temp;
    }
    
    void InsertNode(NODE* head,char chPosition,char chElement)
    {
        NODE* temp;
        NODE* NewNode;
    
        temp=SearchNode(head,chPosition);
    
        NewNode=(NODE *)malloc(sizeof(NODE));
        
        NewNode->chInput=chElement;
        NewNode->next =temp->next ;
        temp->next =NewNode;
    }
    
    
    void DeleteNode(NODE* head,char chElement)
    {
        NODE* temp;
        NODE* DeNode;
    
        temp=head;
        DeNode=head;
    
        if(head->chInput==chElement)
        {
            head=head->next;
            temp->next =NULL;
            free(temp);
        }
        else
        {
            while(DeNode->next!=NULL)
            {
                if(DeNode->next ->chInput ==chElement)
                {
                    temp=DeNode->next ;
                    DeNode->next =DeNode->next->next ;
                    temp->next =NULL;
                    free(temp);
                }
                DeNode=DeNode->next ;
            }
        }
         
    }

       如果要实现多行输入后,然后集中输出,仅需要将上面的Echo函数修改即可实现;思路也很简单,当需要输出指定字符时则 
    单独处理即可,否则就依次输出即可。

    void EchoList(NODE *head)
    {
        NODE* temp;
    
        temp=head;
    
        while(temp->next != NULL)
        {
            switch(temp->chInput)
            {
            case '\t':
                putchar('\\');
                putchar('t');
                break;
            case '\b':
                putchar('\\');
                putchar('b');
                break;
            case '\\':
                putchar('\\');
                putchar('\\');
                break;
            default:
                putchar(Input);
            }
            temp=temp->next ;
        }
    }

      这次就说这么多吧。

  • 相关阅读:
    AOP动态代理两种方式
    Spring AOP的两种代理方式
    面试中关于Redis的问题看这篇就够了
    关于redis,学会这8点就够了
    什么是MVCC
    JAVA 中BIO,NIO,AIO的理解
    JAVA异常体系结构详解
    Java多线程:由浅入深看synchronized的底层实现原理
    为什么wait,notify和notifyAll要与synchronized一起使用?
    Java并发之AQS详解
  • 原文地址:https://www.cnblogs.com/volcanol/p/3016408.html
Copyright © 2011-2022 走看看