zoukankan      html  css  js  c++  java
  • C语言——输入输出函数

    0.getchar()、putchar()

    输入缓冲区,键盘输入是“行缓冲”遇到一个换行符的时候清空缓冲区。

    标准流,stdin和stdout,是标准的输入输出流,键盘输入就是用的stdin。

    文件结尾,C不关心操作系统是如何检测文件结尾,C在检测到文件结尾之后返回EOF。

    getchar();——从输入缓冲区读取一个字符,不管字符是什么,都读取。

    putchar()——打印一个字符,没有换行符。注意putchar只打印一个字符,换行符也算一个字符,想要打印换行符应该是putchat(' ')。

    跳过剩余的char:

    while(getchar()!='
    ')  
    {
        continue;
    }

    1.scanf()

    返回值——返回正确读取的个数int型。      

    这里注意:如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”(如果是“.”呢么要在输入数据的时候加“.”)如“2,3,4”。

    函数测试:用户混合输入int数据和字符串数据。注意这里两个输入是用的英文句号"."分开的,所以输入的时候两个数据应该用英文句号隔开否则就不算正确输入。

    函数设计思路:用户输入两种类型的数据:int和字符串,当用户输入的类型错误的时候提示用户错误并请求再次输入。

    #include<stdio.h>
    
    int main(void)
    {
        int age;
        char name[20];
        puts("please enter your age and your name");
    
        while(scanf("%d.%s",&age,name) != 2)
        {   
            while(getchar()!='
    ')//清空输入缓冲区
            {
                continue;
            }
            puts("age and name,please anain!");
            
        }
    
        while(getchar()!='
    ')//清空输入缓冲区
            {
                continue;
            }
    
        printf("hi %s,",name);
        printf("you are %d years old
    ",age);
        getchar();//等待
        return 0;
    }

    程序中有两个专门清空缓冲区的while循环,(1)用户输入错误的时候输入缓冲区域会留下错误输入的数据,这些数据会连同下一次输入一起作为输入数据,因此必须要清除掉。(2)如果用户输入正确,由于scanf()函数读取之后会留下换行符' '在输入缓冲区中,同样影响下一次输入,因此也要清除掉,其实这里最好用一个getchar(),用getchar()效率更高,我这是偷懒复制的。

    2.printf()

    #include<stdio.h>
    int main(void)
    {
        int i, j;
        i=10;
        j=20;
        printf("i=%d;j=%d", i, j);
        return 0;
    }

    注意printf()不输出换行符,想要换行需要这样:

    printf("i=%d;j=%d
    ", i, j);

    3.gets()

     读取输入缓冲区中所有的字符,遇到换行符 的时候停止,并且把 丢弃然后在读入数据的尾部加上。

    gets()读取成功之后返回字符串的指针,如果读取失败则返回NULL。

    用gets的好处是不用和用scanf一样在后边跟着一个清理 的getchar()。如下:

    #include<stdio.h>
    
    int main(void)
    {
        char name[20];
        puts("please enter your name");
        while(gets(name)==NULL)
        {   
            puts("name,please anain!");
        }
        printf("hi %s",name);
        getchar();//等待
        return 0;
    }

    但是gets()函数步检查容量是否超过参数的容量,特别容易发生溢出,上面的例子name[]容量只有20,一旦用户输入超过20个字符的容量,name数组后面的内存数据就会被覆盖,因此这是非常不安全的。

    C11标准中已经删除了gets()函数,用gets_s()函数代替。

    4.gets_s()

    大写的尴尬。

    5.fgets()

    fgets()函数有三个参数,第一个是读取的字符串要写入的变量,第二个是读取多少个字符(n-1个,例如第二个参数写3那么函数读取2个字符,字符数据大于2就会报错),第三个参数是数据源,如果是从键盘读取那么就是stdin(标准输入流)。

    fgets()函数不会把 丢掉并在字符串尾部添加,而是原封不动的把所有东西全部写入到变量中( 也是)。

    与gets()一样fgets()也是返回输入字符串指针(成功读取的话),读取失败会返回NULL。

     把gets()函数改成如下;

    #include<stdio.h>
    
    int main(void)
    {
        char name[20];
        puts("please enter your name");
        while(fgets(name,20,stdin)==NULL)
        {   
            puts("name,please anain!");
        }
        printf("hi %s,how old are you?",name);
        getchar();//等待
        return 0;
    }

    就会有如下输出:

    很尴尬,因为fgets()函数连同 一起读取到了数组name中,输出的时候也一起输出了,所以“,how old are you ?”就被换行了。

    6.puts()

    puts()函数使用很简单,他只有一个参数,字符串地址。

    与printf()不同,puts()函数自动添加一个 到字符串尾部,也就是说:自动换行。

    还是看上面的代码:

    #include<stdio.h>
    
    int main(void)
    {
        char name[20];
        puts("please enter your name");
        while(fgets(name,20,stdin)==NULL)
        {   
            puts("name,please anain!");
        }
        printf("hi %s,how old are you?",name);
        getchar();//等待
        return 0;
    }

     注意main()函数内的第二行,尾部并没有换行符 。但是输出的时候:

    自动换行了。

    注意puts()的参数是一个地址,如果想要输出name中的字符串的话:

     puts(name);

    注意:puts()遇到空字符就会停止输出。

    如下:

    d没有了。大写的尴尬!!!

     但这还不是最严重的,puts()只有遇到空字符才会结束输出,那么,如果字符串中没有空字符呢?

    这时puts就不知道应该在哪里停止输出了,所以会造成程序的不稳定,如下我重新修改了下数组数据,删掉了:

    程序在e后面多了一个方框。

    注意如果字符串中没有,printf也会蒙圈的:

    7.fputs()

    fputs()需要指定输出流:

    且fputs()并不会像puts()一样自动添加换行符。

    注意:如果name数组最后一个元素不是的话还是会出错的。

    8.总结

    gets()与put()搭配,输入的时候把 替换成(其实是去掉之后再加上,意思差不多),输出的时候添加

    fgets()与fput()搭配,输入的时候原封不动的把 读取,输出的时候不自动添加 。

    参考:https://www.cnblogs.com/qingergege/p/5925811.html 

  • 相关阅读:
    JavaScript二进制数据序列化和反序列化
    三维变换矩阵推导笔记
    如何制作一款“有毒”的游戏
    如何使用visual studio将你的程序打包成安装包
    游戏设计模式系列(三)—— 策划变心太快?也许可以使用组合
    使用LayaAir解析xml文件
    游戏设计模式系列(二)—— 适时使用观察者模式,解耦你的代码
    游戏设计模式系列(一)—— 单线逻辑&&数据驱动,搞定最容易卡死的结算界面
    vs2010 win32程序中 sqlserver 2008 express的简单使用 (C++)
    UVALive 6529
  • 原文地址:https://www.cnblogs.com/feipeng8848/p/7273939.html
Copyright © 2011-2022 走看看