3.4 数据的输入输出

一、输入输出的相关概念

  1. 所谓输入输出是以计算机为主机而言的。

  2. C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的。

    1. printf函数 和 scanf函数 不是 C语言提供的输入输出语句,也不是 C语言的关键字, 而只是 库函数的名字,函数声明在 stdio.h 这个库里面。

    2. 为什么不提供输入输出语句呢? 答曰:为了使编译阶段不涉及计算机硬件操作,从而使编译系统简化,通用性强,可移植性好。

    3. 各种C编译系统提供的系统函数库是各软件公司编制的。

    4. 如果源程序中有printf 函数,在编译时并不把他翻译成目标指令,而是在连接阶段与系统函数库相连接后,在执行阶段中调用函数库中的printf函数。

  3. 要在程序文件开头用预处理指令 # include 把有关头文件放在本程序中。

    1. # include <> 称为标准方式,编译系统从存放编译系统的子目录中去找所要包含的文件(如 stdio.h)

    2. # include "" 先在当前目录,一般是用户存放源程序文件的子目录找,找不到再按标准方式找

二、输入输出的函数

(一) printf 函数 && scanf 函数

printf 函数

  1. 一般格式: printf(格式控制,输出表列)

    1. 格式控制:包含格式声明和普通字符

      graph LR subgraph 格式控制字符串 格式声明--- 普通字符 end

      格式声明:% + 格式字符(d、f、c、s……) 普通字符(原样输出的字符):换行、空格、逗号等字符

    2. printf(参数1,参数2,参数3,参数4)
      其中:参数1是格式控制字符串,其他参数都是需要输出的数据

  2. 格式字符

格式字符

说明

d,i

以带符号的十进制形式输出整数(正数不输出符号)

o

以八进制无符号形式输出整数(不输出前导符0)

x,X

以十六进制无符号形式输出整数(不输出前导符0x),用x则输出十六进制数的a~f时以小写形式输出,用X时,则以大写字母输出,还可以在X前加一个#,这样输出就会有个提示的0x数字(scanf不能加#)

u

以无符号十进制形式输出整数

c

以字符形式输出,只输出一个字符

s

输出字符串

f

以小数形式输出单、双精度数,隐含输出6位小数

e,E

以指数形式输出实数,用e时指数以“e”表示(如1.2e+02),用E时指数以“E”表示(如1.2E+02)

g,G

选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0。用G时,若以指数形式输出,则指数以大写表示

  1. 格式附加字符
    在格式控制字符串的格式声明中(%+上表的格式字符)可以插入格式附加字符(又称为修饰符)

    1. 长度修正符

      1. l:对整型指定为long型,对实型指定为double型

          printf("%ld\n",38977736L);  //以长整型输出
          printf("%lf\n",3.143);  //以double型输出  
      
      1. h: 只用于将整型的格式字符修正为short 型 %hd

    2. 域宽及精度描述符

      1. 用一个自然数指域宽:用一个自然数表示域宽,即对应的输出项在输出设备所占的字符数

      printf("%5d",54)
      //输出结果
      (此处三个空格)54
      
      1. 用一个小数指精度:用于说明实型小数的小数位数,对于字符串、则表示截取字符串的字符个数

      printf("%.1lf\n",54.485678);//输出54.5
      printf("%.2lf\n",54.4);//输出54.40
      printf("%3.2lf\n",54.4);//输出54.40
      printf("%6.1lf\n",54.485678);//输出(2个空格)54.5
      printf("%3.2lf\n",54.485678);//输出54.49
      //.n  表示以n位小数输出结果,多的以四舍五入截取,少的补0
      //m.n m表示所占字符,n表示小数位数。
      //不指定小数位数,默认按6位输出  
      //优先满足小数位数的要求
      //如果满足小数位数的要求后导致整个数字字符长度超过m的大小,整数部分也不会截取的。 
      //如果m大于满足小数位数的要求且加上整数部分的字符为数,输出结果前边补空格
      
    3. 指定空位是否填0

      printf("%010d\n",54);
      //输出结果:
      0000000054
      Press any key to continue . . . 
      
    4. 小短线 - 用于指定是否左对齐输出

      printf("%5d",54);
      //   54Press any key to continue . . .
      printf("%-5d",54);
      //54   Press any key to continue . . . 
      
  2. 为什么要有输出控制符 同样的0101二进制可能表达的是数据也有可能表达的是指令。
    一组二进制数据如果表达的是数字的话,以不同格式输出,会有不同的输出结果。

scanf 函数

  1. 一般格式 scanf(格式控制,地址表列) 地址表列:&变量地址||&字符串首地址
    功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量

  2. 格式字符 基本上和printf的一样
    注意:在以十六进制输入时,不能和printf一样,在x前边加一个#,也就是说类似于%#x只能printf用。

  3. 格式附加字符
    和printf一样可指定域宽。
    不可以用小短线表示左对齐。

  4. 其他注意问题
    非输入控制符必须原样输入,例子如下:

    double a;
     int b;
     scanf("a=%lf,b=%d",&a,&b);
     printf("%lf,%d\n",a,b);
    //像这句输入时不能只写数字,必须输入a=数字,b=数字[逗号也得输入]
    
    scanf("%d,%d,%d",&a,&b,&c)
    结果:
    6 8 9  //这些是键盘输入的带空格的
    6 -858993460 -858993460  //这是屏幕输出
    请按任意键继续. . .
    可见只有第一个字符能正确输出
    所以必须原样输入非控制字符
    

    在用%c的格式说明输入字符时,空格和转义字符都作为有效数字输入,例子如下

    char a,b,c;
    scanf("%c%c%c",&a,&b,&c);
    printf("%c\n%c\n%c\n",a,b,c);
    //这段代码运行时直接连续输入三个字符,中间不能加空格或者是其他任何符号,这些符号都会算有效字符!!!
    

    在输入时,遇到回车、Tab、空格或者其他非法字符时会认为输入结束。 以第一段程序为例:

    double a;
     int b;
     scanf("a=%lf,b=%d",&a,&b);
     printf("%lf,%d\n",a,b);
    //像这句输入时不能只写数字,必须输入a=数字,b=数字[逗号也得输入]  
    //
    这段程序运行,输入  
    a=4.7,b=9  
    需要点一次回车
    或者点一次空格  
    或者点一次Tab  
    会运行printf那句,输出结果。  
    

    以什么格式控制符输入,就必须以哪种格式从键盘输入
    以十进制数字格式输入,就不能输入字符'A'(区别于printf)

    int a;
     int b;
     int c;
     scanf("%d,%d,%d",&a,&b,&c);
     printf("%d %d %d\n",a,b,c);  
    //第一种
    A,C,77
    -858993460 -858993460 -858993460
    请按任意键继续. . .
    //第二种
    4,6,A
    4 6 -858993460
    请按任意键继续. . .
    
    

    scanf格式控制千万不要习惯性加\n,这是非常不好的行为

    int a;
     scanf("%d\n",&a);
     printf("%d\n",a);
    //结果
    4
    
    
    
           \n   //这些都是输入,直到原样输入\n才能结束输入
    4           //这是输出结果
    请按任意键继续. . .
    
    
  5. 对用户非法输入的处理

    //非法输入示例
     int a;
     int b;
     printf("请以十进制整数形式输入a的值:")
     scanf("%d",&a);
    
     printf("请以十进制整数形式输入b的值:")
     scanf("%d",&b);
    
     printf("\n");
     printf("a=%d\n",a);
     printf("b=%d\n",b);
    
     //第一种错误
         请以十进制整数形式输入a的值:123m(输入124m后回车输出结果,发现把垃圾值给了b)
         请以十进制整数形式输入b的值:
         a=123
         b=-858993460
         请按任意键继续. . .
     //用程序实现当我们要接受一个数据前把前面的垃圾值去掉。  
     //例如本案例,123m,这个m是前一个数据输入非法值,却把这个垃圾值赋给了b。如何避免呢???  
     //也就是自动丢弃非法输入的值,不要保留至下次输入。  
     //在下一个输入前加一句:
     while((getchar())!='\n')
         continue;
    
    //示例:
     int main()
     {
         int a;
         int b;
         printf("请以十进制整数形式输入a的值:");
         scanf("%d",&a);
    
         while((getchar())!='\n')
             continue;
         printf("请以十进制整数形式输入b的值:");
         scanf("%d",&b);
    
         printf("\n");
         printf("a=%d\n",a);
         printf("b=%d\n",b);
         system("pause");
         return 0;
     }  
     //效果
     请以十进制整数形式输入a的值:123m
     请以十进制整数形式输入b的值:345
    
     a=123
     b=345
     请按任意键继续. . .
    
    

(二) putchar 函数 && getchar 函数

putchar函数 输出

  1. 作用 putchar(c); 向终端输出一个字符c,变量可以是字符型'A'也可以是整型:56,整型数据代表输出是这个整型数字所代表的ASCII字符

     int main()
     {
         char a;
         char b;
         a=65;
         b='A';
         putchar(a);
         putchar('\n');
         putchar(b);
         putchar('\n');
         system("pause");
         return 0;
     }
     //结果如下:
     A
     A
     请按任意键继续. . .
    
    
  2. 注意点

    1. 可以输出控制字符:putchar('\n');单引号哦

    2. 可以输出转义字符

    3. 一次只能输出一个字符,输出多个必须用多条语句

getchar()函数,字符输入函数

  1. 作用 getchar();
    从终端输入一个字符,函数的值是从输入设备得到的字符

     int main()
     {
         char a;
         a=getchar();
         putchar(a);
         putchar('\n');
    
         system("pause");
         return 0;
     }
     //输出即所得,数字不代表ASCII,只是一个字符格式的数字,且只能有一位
     //输入65,输出只能保留6
     //输入2,输出2
     //区别于putchar
    
  2. 注意点

    1. getchar()只能接受一个字符

    2. 它所得到的值可以赋给一个字符变量或一个整型变量,也可以不赋给任何变量,作为表达式的一部分。

    putchar(getchar());
    

(三) puts 函数 && gets 函数[后续和数组、字符串一起介绍]


本文章使用limfx的vsocde插件快速发布