zoukankan      html  css  js  c++  java
  • 第8章 字符输入/输出和输入验证

    8.1  单字符i/o:getchar()和putchar()

    8.2  缓冲区

    无缓冲输入:用户输入字符后,立即打印

    缓冲输入:用户输入的字符被收集并储存在一个被称为缓冲区的临时存储区,按下Enter后,程序才可以使用用户输入的字符。

    缓冲分为:完全缓冲I/O和行缓冲I/O。

    完全缓冲I/O:缓冲区被填满时才刷新缓冲区。

    行缓冲I/O:出现换行符时刷新缓冲区。

    8.3  结束键盘输入

    8.3.1  文件、流、键盘输入

    文件:存储器中储存信息的区域。

    流:实际输入/输出映射的一个理想化数据流。

    8.3.2  文件结尾

    1:以ctrl+z字符来标记文件结尾。

    2:储存文件大小的信息。

    c语言中getchar()读取到文件检测到文件结尾时将返回一个特殊的值即EOF(end of file)scanf()函数检测到结尾也返回EOF。

    通常EOF定义在stdio.h文件中:

    #define EOF (-1)

    使用键盘输入EOF:要使用Ctrl+Z或Ctrl+D

    8.4  重定向和文件

    8.4.1  unix、linux、dos重定向

    1.重定向输入

    例:echo_eof<word    echo_eof是一个可执行文件,word是一个文本文件。该目的是用文件替换键盘输入。

    2.重定向输入

    例:echo_eof>word    该目的是键盘读取的数据输出到word文件中。

    3.组合重定向

    echo_eof<myword>saveword  等同与echo_eof>saveword<myword.

    遵守原则:

    重定向运算符连接一个可执行文件和一个数据文件

    不能读取多个文件的输入/输出

    通常文件名和运算符之间的空格不是必须的。

    8.5  创建更友好的用户界面

    5.5.1  使用缓冲输入

    例:当输入非‘y’的字符时,程序会打印一次“111111111”,但实际上打印了两次,程序读取输入字符后判断,然后还将换行符读取进行了一次判断。

    while(getcha()!='y')
    {
    printf("1111111111")
    /*改变方法
    while(getchar()!=' ')
    continue;
    */ }

     8.5.2  混合数值和字符输入

    当同时使用scanf和getchar时,scanf读取数字会跳过空格。

    8.10  复习题

    3.

    #include<stdio.h>
    int main()
    {   
        int ch;
        int i=0;
        while (getchar()!='
    ')
        {
            i++;
        }
        putchar(i);
        return 0;
    }

     8.11  编程练习

    2.

    #include<stdio.h>
    int main()
    {   
        int ch, i=0;
        for ( i = 1; (ch=getchar())!=EOF; i++)
        {
            if (ch>=' '|| ch=='
    '||ch=='	')//32空格是一个界限,小于32的都是控制字符。
            {
                printf("%-5c",ch);
            }
            else
            {
                printf("^%-4c",ch+64);
            }
            printf("%-5d",ch);
            if (i%10 == 0)
            {
                printf("
    ");   
            }   
        }
        
        return 0;
    }

    3.

    #include<stdio.h>
    #include<ctype.h>
    int main(void)
    {
        int ch,i=0,j=0;
        while ((ch=getchar())!=EOF)
        {
            if (islower(ch))
            {
                i++;
            }
            else if (isupper(ch))
            {
                j++;
            }
            if (ch=='
    ')
            {
                printf("大写%d,小写%d",j,i);
            }  
        }
        
        return 0;
    }

    4.

    #include<stdio.h>
    #include<ctype.h>
    float word_quantity(void);//字符流输入,计算平均单词字母数
    int main (void)
    {
        word_quantity();
        return 0;
    }

    float word_quantity(void)
    {
        int ch,i=0;
        float j=0.0,k=0.0;//i为标志位
        while ((ch=getchar())!= EOF)
        {
            if( isalpha(ch) )
            {
                i=1;
                j++;
            }
            else if ( ispunct(ch) || (ch==' ') || (ch==' ')) 
            {
                if (i==1)
                {
                    k++;
                    i=0;
                }
                else
                {
                    i=0;
                }           
            }
            if (ch==' ')
            {
                if (k==0)
                {
                    printf("请重新输入");
                }
                else 
                {
                printf("平均单词数位%.2f ",j/k);
                j=0;
                k=0;               
                }                      
            }  
        }    
        return 0;  
    }

    5.理解二分法,当选择大于时要修该max,选择小于要修改min。

    #include<stdio.h>
    #include<ctype.h>
    #include<stdbool.h>
    int main (void)
    {
        float num=50;
        bool bingo =false;
        int i=0;
        float max=100,min=0;
        while (!bingo)
        {
            printf("number is %.2f
    ",num);
            printf("1.大了,2.小了,3.猜对了
    ");
            if ((scanf("%d",&i)==1)&&(i>=1&&i<=3))
            {
                switch (i)
                {
                case 1:
                    max=(min+max)/2;
                    num=(min+max)/2;
                    break;
                case 2:
                    min=(min+max)/2;
                    num=(min+max)/2;
                    break;            
                case 3:
                    max=(min+max)/2;
                    num=(min+max)/2;
                    break;            
                }
            }
            else
            {
                printf("请输入正确格式
    ");
            }   
        }
        
        return 0;
    }

     6.

    #include<stdio.h>
    #include<ctype.h>
    #include<stdbool.h>
    int main (void)
    {
        int ch;
        bool bingo=false;
        while (!bingo)
        {   
            ch=getchar();
            if(!isblank(ch))
            {
                bingo=true;  
                printf("第一个非空字符为%c",ch);
            }          
        }
        while (getchar()!='
    ')
        continue;  
        getchar();    
        return 0;
    }

    ------------恢复内容结束------------

  • 相关阅读:
    【内存管理】STL空间配置器
    【关键帧提取】基于CSD特征
    【内存管理】内存池技术
    【CUDA学习】计时方法
    【内存管理】简单的分配程序(续1)
    【背景建模】基于时空特征(续1)
    【OpenCV学习】准确定位帧
    【背景建模】基于时空特征(续2)
    【内存管理】简单的分配程序
    32位asp.net应用程序在64位Windows上运行时的问题一例
  • 原文地址:https://www.cnblogs.com/suwencjp/p/12350253.html
Copyright © 2011-2022 走看看