• C 字符输入输出和输入确认


    1.前导程序

    //一个菜单程序
    #include<stdio.h>
    char get_choice(void);
    char get_first(void);
    int get_int(void);
    void count(void);
    int main(void)
    {
        int choice;
        void count(void);
    
        while((choice=get_choice())!='q')
        {
            switch(choice)
            {
            case 'a':printf("Buy low,sell high.
    ");
                break;
            case 'b':putchar('a');
                break;
            case 'c':count();
                break;
            default:printf("program error!
    ");
                break;
            }
        }
        printf("Bye.
    ");
        return 0;
    }
    
    void count(void)
    {
        int n,i;
        printf("count how far? Enter an integer:
    ");
        n=get_int();
        for(i=1;i<=n;i++)
            printf("%d
    ",i);
        while(getchar()!='
    ')
            continue;
    }
    
    char get_choice(void)
    {
        int ch;
        printf("Enter the letter your choice:
    ");
        printf("a.advice            b.bell
    ");
        printf("c.count             q.quit
    ");
        ch=get_first();
        while((ch<'a'||ch>'c')&&ch!='q')
        {
            printf("please respond with a,b,c,or q.
    ");
            ch=get_first();
        }
        return ch;
    }
    
    char get_first(void)
    {
        int ch;
        ch=getchar();
        while(getchar()!='
    ')
            continue;
        return ch;
    }
    
    int get_int(void)
    {
        int input;
        char ch;
    
        while(scanf("%d",&input)!=1)
        {
            while((ch=getchar())!='
    ')
                putchar(ch);//剔除错误的输入
            printf("is not an integer.
    ");
            printf("please enter an integer value,such as 25,-178,or 3:");
        }
        return input;
    }
    View Code

    2.单字符I/O:getchar()和putchar()

    • getchar和putchar()每次输入和输出一个字符。
    • 输入回显是大多数处理文本的程序的核心。
    • 他们不是真正的函数而是定义为预处理器宏。
    • 缓冲区完全缓冲和行缓冲。
    //重复输入
    //putchar()函数和getchar()的使用
    #include<stdio.h>
    int main(void)
    {
        char ch;
    
        while((ch=getchar())!='#')
            putchar(ch);
        return 0;
    }
    View Code

    3.终止键盘输入

    • 文件时一块存储信息的存储器区域,通常文件被保存在某种类别的永久存储器上。
    • C程序处理一个流而不是处理文件。
    • 计算机操作系统两种检测文件结尾的方法,1.在文件中放置一个特殊字符来标志结尾。2.让操作系统存储文件大小的信息。
    • C处理文件结尾的方法:#define EOF   (-1)   让getchar()函数在到达文件结尾时返回一个特殊值。eof并不是实际出现在文件中的一个符号。
    //重复输入,知道文件的结尾
    //使用EOF来标记文件的结尾   ctral+z
    //每次按下回车键,处理缓冲区中存储的字符,并且打印一行副本。
    #include<stdio.h>
    int main(void)
    {
        char ch;
    
        while((ch=getchar())!=EOF)
            putchar(ch);
        return 0;
    }
    View Code

    4.重定向和文件

    • 重定向与操作系统而不是C相关联。
    • 输入重定向:echo_eof<words//运算符把words文件和stdin流关联起来,C将文件和I/O设备置于相同的地位,所以现在这个文件就是I/O设备。
    • 输出重定向:echo_eof>mywords//导致建立一个mywords的新文件供使用,然后将输出重定向到该文件。CTRL+Z
    • 组合重定向:重定向运算符的顺序无关紧要。1.只能将一个可执行程序和一个数据文件连接起来。2. 输入和输出只能来自或定向到一个文件。
    • 管道运算符‘|’可以将一个程序的输出与第二个程序的输入连接起来。
    //打开一个文件并显示其内容
    #include<stdio.h>
    #include<stdlib.h>//为了适应exit()
    int main(void)
    {
        int ch;
        FILE*fp;
        char fname[50];//用于存放文件名
    
        printf("Enter the name of the file:");
        scanf("%s",fname);
        fp=fopen(fname,"r");//打开文件以供读取
        if(fp==NULL)//尝试打开文件失败
        {
            printf("Failed to open file.Bye
    ");
            exit(1);//终止程序
        }
        //getc(fp)从打开的文件中获取一个字符
        while((ch=getc(fp))!=EOF)
            putchar(ch);
        fclose(fp);  //关闭文件
        return 0;
    }
    打开一个文件并显示其内容

    5.创建一个更友好的用户界面

    (1)使用缓冲输入

    //猜数游戏
    #include<stdio.h>
    int main(void)
    /*{
        int guess=1;
        printf("Pick an integer from 1 to 100.I will try to guess it.
    ");
        printf("Respond with a y if my guess is right and with 
    ");
        printf("an n if it is wrong.
    ");
        printf("UH....is your number %d?
    ",guess);
        while((getchar()!='y'))             //获取用户响应并和y比较
            printf("Well,then,is it %d?
    ",++guess);
        printf("I kenw I could do it!
    ");
        return 0;
    }*/
    //
    /*{
        int guess=1;
        printf("Pick an integer from 1 to 100.I will try to guess it.
    ");
        printf("Respond with a y if my guess is right and with 
    ");
        printf("an n if it is wrong.
    ");
        printf("UH....is your number %d?
    ",guess);
        while((getchar()!='y'))             //获取用户响应并和y比较
        {
            printf("Well,then,is it %d?
    ",++guess);
            while(getchar()!='
    ')
                continue;
        }
        printf("I kenw I could do it!
    ");
        return 0;
    }*/
    //使用一个if语句来筛选掉其他响应
    {
        char Response;//添加一个变量来存储响应!!!
        int guess=1;
        printf("Pick an integer from 1 to 100.I will try to guess it.
    ");
        printf("Respond with a y if my guess is right and with 
    ");
        printf("an n if it is wrong.
    ");
        printf("UH....is your number %d?
    ",guess);
        //请注意,在修改的时候while判断语句也要改把值赋给变量Response
        while((Response=getchar())!='y')             //获取用户响应并和y比较
        {
            if(Response=='n')               //使用一个if语句
                printf("Well,then,is it %d?
    ",++guess);
            else
                printf("sorry,I understand only y or n.
    ");//添加说明语句
            while(getchar()!='
    ')
                continue;
        }
        printf("I kenw I could do it!
    ");
        return 0;
    }
    猜数游戏

    (2)混合输入数字和字符

    //一个关于I/O问题的程序
    //完成第一次打印染污后,程序提示输入第二组数据,可是在还没有做出响应之前程序就退出了,问题在哪里?
    #include<stdio.h>
    void display(char cr,int lines,int width);
    int main(void)
    {
        int ch;//要打印的字符
        int rows,cols;
        printf("Enter a character and two integers:
    ");
        while((ch=getchar())!='
    ')
        {
            scanf("%d%d",&rows,&cols);
            display(ch,rows,cols);//调用函数打印字符
            printf("Enter another character and two integers:
    ");
            printf("Enter a newline to quit.
    ");
        }
        printf("Bye!
    ");
        return 0;
    }
    
    void display(char cr,int lines,int width)
    {
        int row,col;//请注意这里的变量和主函数变量的区别
    //用一个双重循环打印字符
        for(row=1;row<=lines;row++)
        {
            for(col=1;col<=width;col++)
                putchar(cr);
            putchar('
    ');
        }
    }
    //scanf()函数将换行符留在了输入队列中,getchar()并不跳过换行符,所以在循环的下一个周期,
    //在有机会输入第二组数据之前,这一换行符由getchar读取,然后赋值给ch,而ch为换行符则正是终止循环的条件
    /*
    #include<stdio.h>
    void display(char cr,int lines,int width);
    int main(void)
    {
        int ch;//要打印的字符
        int rows,cols;
        printf("Enter a character and two integers:
    ");
        while((ch=getchar())!='
    ')
        {
            if(scanf("%d%d",&rows,&cols)!=2)//判断输入
                break;
            display(ch,rows,cols);//调用函数打印字符
            while(getchar()!='
    ')//如果读取的是一个字符,则跳出
                continue;
            printf("Enter another character and two integers:
    ");
            printf("Enter a newline to quit.
    ");
        }
        printf("Bye!
    ");
        return 0;
    }
    
    void display(char cr,int lines,int width)
    {
        int row,col;
        for(row=1;row<=lines;row++)
        {
            for(col=1;col<=width;col++)
                putchar(cr);
            putchar('
    ');//结束本行,开始新的一行
        }
    }
    */
    View Code

    6.输入确认

    //输入确认
    //在通常情况下,程序用户不总是遵循指令,在程序所期望的输入与实际获得的输入之间可能存在不匹配
    #include<stdio.h>
    #include<stdbool.h>
    //确认输入了一个整数
    int get_int(void)
    //确认范围的上下界是否有效
    bool bad_limits(int begin,int end,int low,int high);
    //计算从a到b之间的整数的平方和
    double sum_squares(int a,int b);
    int main(void)
    {
        const int MIN=-1000;
        const int MAX=+1000int start;
        int stop;
        double answer;
    
        printf("This program computs the sum of the squares of"
            "integers in a range.
    The lower bound should not"
            "be less than -1000 and
    the upper bound should not"
            "be more than +1000.
    Enter the limits (enter 0 for"
            "both limits to quit):
    lower limit:");
        start=get_int();
        printf("upper  limit:");
        stop=get_int();
        while(shart!=0||stop!=0)
        {
            if(bad_limits(start,stop,MIN,MAX))
                printf("Please try again.
    ");
            else
            {
                answer=sum_squares(stare,stop);
                printf("The sum of the squares of the integers from");
                printf("from %d to %d is %g
    ",start,stop,answer);
            }
            printf("Enter the limits(enter 0 for both limits to quit):
    ");
            printf("lower  limit:");
            start=get_int();
            printf("upper limit:");
            stop=get_int();
        }
        printf("Done!
    ");
        return 0;
    }
    
    //使用get_int()函数来获取值
    int get_int(void)
    {
        int input;
        char ch;
    
        while(scanf("%d",&input)!=1)//用while循环来处理值
        {
            while((ch=getchar())!='
    ')
                putchar(ch);//剔除错误的输入
            printf("is not an integer.
     please enter an integer value,such as 25,-178,or 3:");
        }
        return input;
    }
    
    //程序核心部分,进行实际计算
    double sum_squares(int a,int b)
    {
        double total=0;
        int i;
    
        for(i=a;i<=b;i++)
            total+=i*i;
        return total;
    }
    
    //bad_limits()函数来检查值的有效性
    bool bad_limits(int begin,int end,int low,int high)
    {
        bool not_good=false;
        if(begin>end)
        {
            printf("%d isn't smaller than %d.
    ",begin,end);
            not_good=true;
        }
        if(begin<low||end<low)
        {
            printf("Values must be %d or greater.
    ";low);
            not_good=true;
        }
        if(begin>high||end>high)
        {
            printf("Values must be %d or less.
    ",high);
            not_good=true;
        }
        return not_good;
    }
    View Code
    • 输入由字符构成,但scanf函数可以将输入转换成整数或浮点数,使用想%d和%f这样的说明符能限制可接受的输入字符类型,但getchar()和使用%c的scanf函数接受任何字符。
  • 相关阅读:
    python学习第十五天
    python学习第十三、十四天
    python学习第十二天
    python学习第j十一天
    python学习第十天
    ViewController push的自定义动画
    iOS 判断设备是否越狱
    iOS
    OBJC字面量
    ios8 share Extension 分享扩展
  • 原文地址:https://www.cnblogs.com/dondre/p/4090129.html
Copyright © 2020-2023  润新知