112.C语言_输入输出

第三章 输入输出

  • 3.1输入输出概念及其实现
    • (1)数据从计算机内部向外部输出设备(如显示器、打印机等)输送的操作称为 “输出”,数据从计算机外部向输入设备(如键盘、鼠标、扫描仪等)送入的操作称为 “输入”。
    • (2)C语言本身不提供输入输出语句,可以通过函数来实现输入和输出的操作。
    • (3)在使用C语言库函数时,首先要用预编译命令 “ #include”将有关的“头文件”包含到用户源文件中。
  • 3.2单个字符的输入输出#include <stdio.h>
    • 3.2.1字符输出函数putchar()
      • putchar()函数的作用是向终端输出一个字符。
        • 如:
        • putchar(a);
        • 它输出字符变量a的值,a也可以是字符型变量或整型变量。若a是整型变量,则输出的是ASCII码值为该变量值的那个字符。
    • 3.2.2字符输入函数getchar()
      • getchar()函数的作用是从终端输入一个字符,getchar()函数没有参数,函数值就是从输入设备得到的字符。
      • getchar()只能接收一个字符,getchar()函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。如果在一个函数中(今为main()函数)要调用getchar()和putchar()函数,在该主函数之前的包含命令“#include <stdio.h>“是必不可少的。
  • 3.3数据格式的输入与输出
    • 3.3.1 printf()函数
      • 定义
        • printf()函数是C语言提供的标准输出函数,它的作用是向终端(或系统隐含指定的输出设备)按指定格式输出若干个数据。遇到控制字符,按照控制字符的规定输出,遇到非格式字符串按原样输出。
      • 一般形式:
        • printf(“格式控制字符串”,输出列表);
          • 如:
            • printf(“%f,%d”,x,y);
      • printf是函数名,括号内由以下两部分组成:
        • (1)“格式控制”:
          • 用双引号括起来的字符串是“格式控制”字符串,它包括两种信息。
            • ① 格式转换说明,由“%”和格式字符组成,如 %d、%s等。上例中,当输出项为int 型时,系统规定用d作为格式描述字符,因此,有“%d”。当输出项为float或double类型时,用f或e作为格式描述字符。格式描述符要与输出项一一对应且类型匹配。
              • %[flags] [width] [.prec] [hlL] type
              • 格式字符
                • 可以根据需要在“%”与格式字符之间插入“宽度说明”、左对齐符号“-”、前导零符号“0”等。
                  • (1)d格式符,用来对十进制数进行输入输出,其中“%d”按整型数据的实际长度输出,“%md”指定m为输出字段所占的宽度。
                  • (2)o格式符,以八进制数形式输出整数,同样可以通过如“%8o”的格式指定输出时所占的宽度。
                  • (3)x格式符,以十六进制数形式输出整数,同样可以通过如“%12x”的格式指定输出时所占的宽度。
                  • (4)u格式符,用来输出 unsigned 型数据,即输出无符号的十进制数。
                  • (5)c格式符,用来输出一个字符。
                  • (6)s格式符,用来输出一个字符串。
                  • (7)f格式符,用来输出实数(包括单、双精度),以小数形式输出,使整数部分全部如数输出。
                  • (8)e格式符,以指数形式输出实数。
                  • (9)g格式符,用来输出实数。
                • 对于f、e、g格式符可以用“整型数1.整型数2“的形式,在指定宽度的同时来指定小数位的位数,其中,“整型数1”用来指定输出数据所占的总宽度,“整型数2”用来确定精度。精度对于不同的格式符有着不同的含义。当输出位数多于“整型数2”指定的宽度时,截去右边多余的小数,并对截去的第一位小数做四舍五入处理。当输出数据的小数位数少于“整型数2”指定的宽度时,在小数的最右边添0,当输出的数据所占的宽度大于“整型数1”指定的宽度时,小数位仍按上述规则处理,整数部分并不丢失。也可以用“.整型数2”的形式来指定小数位数,这时输出的数据所占宽度由系统决定。通常,系统对float类型提供7位有效位数,对于double类型提供15位有效位数。
            • ② 需要原样输出的字符(通常指除了格式说明与一些转义字符外的那部分)也写在格式控制内。
        • (2)“输出表列”是需要输出的一些数据,可以是常量、变量或表达式。例如:
          • printf(“x=%dy=%d”,x,y);
          • 其中,“x=%dy=%d”是格式说明 ; x,y是 输出表列。输出表列中的各输出项要用逗号隔开。若x,y的值为7,8 ,以上两条输出结果为:x=7y=8 在两数之间有空格,因为在两个格式说明符中间有一个空格。
      • 使用printf()函数时的注意事项
        • (1)在格式控制字符串中,格式说明与输出项从左到右在类型上必须一一对应匹配,如不匹配将导致数据输出出现错误,如在输出long型数据时,一定要用%ld格式控制,而不能用%d格式控制。
        • (2)在格式控制串中,格式说明与输出项的个数也要相等,如格式说明的个数多于输出项的个数,则对于多余的格式将输出不定值(或0值)。
        • (3)在格式控制串中,除了合法的格式说明外,可以包含任意的合法字符(包括转义字符),这些字符在输出时将被“原样输出”。
        • (4)如果要输出 “%“,则应该在格式控制串中用两个连续的百分号“%%”来表示。
    • 3.3.2 scanf()函数
      • scanf()函数的一般形式
        • scanf(“格式控制字符串”,地址表列);
        • 若格式控制字符串中有非格式字符串,则按原样输入。A=%d,b=%c若格式控制字符串中没有非格式字符,作输入数据之间的间隔,则可用空格、Tab、回车作间隔。%d%c
        • 在输入字符数据时,若格式控制字符串中无非格式字符,则认为所有输入的字符均为有效字符。空格会被当作字符赋值给变量。
      • 其中scanf是函数名,“格式控制“的含义同printf( )函数, “地址表列“由若干个变量地址组成,既可以是变量的地址,也可以是字符串的首地址(参见“字符数组“一节)。
        • 例如:
          • scanf(“%d”,&a);
          • printf(“%d”,a);
          • 运行时输入123,按回车键后则会在屏幕上输出整型变量a的值123 。其中“%d”是格式控制字符串。 &a 是输入项。其中的“&”是“取地址运算符”,&a指a在内存中的地址,如需要有多个输入项时,输入项之间要用逗号隔开。在实际输入时,若一次向计算机输入多个数据,则每两个数据间要以一个或多个空格间隔,也可以用回车键或跳格键【Tab】。
        • 格式说明
          • scanf()函数中的格式说明也是以%开始,以一个格式字符结束,中间可以加入附加的字符。
          • (1)对unsigned型变量的数据,可以用 %d、%o、%x格式输入。
          • (2)在scanf( )函数中格式字符前可以用一个整数指定输入数据所占宽度,但对于实型数则不能指定其小数位的宽度。
          • (3)在格式控制串中,格式说明的个数应该与输入项的个数相等,且要类型匹配,如不匹配,系统也不会给出出错信息,但有可能使程序的结果不正确。若格式说明的个数少于输入项的个数,scanf( )函数结束输入,多余的项继续从终端接收新的数据,若格式说明的个数多于输入项个数时,scanf( )函数同样也结束输入。
      • 使用scanf()函数时应注意的问题
        • (1)scanf()函数中的输入项只能是地址表达式,而不能是变量名或其他内容,也就是说输入项必须是某个存储单元的地址,这一点一定要掌握。
          • 例如:
            • int m,n;
            • scanf(“%d,%d”,m,n);
            • 是不对的,应将其中的“m,n“改为 “&m,&n”。
        • (2)如果在“格式控制“字串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。
        • (3)在用 “%c”格式输入字符时,空格字符和转义字符都作为有效字符输入。
        • (4)在输入数据时,若实际输入数据少于输入项个数,scanf( )函数会等待输入,直到满足条件或遇到非法字符才结束;若实际输入数据多于输入项个数,多余的数据将留在缓冲区备用,作为下一次输入操作的数据。
        • (5)scanf( )函数中的格式控制串是为输入数据用的,其间的字符不能实现原样输出。若想在输入时出现提示性语言,则需要另外使用printf语句
        • (6)在输入数据时,遇到以下情况时认为输入结束
          • 空格、按“回车”或“跳格”(【Tab】)键,上述字符统一可称为“间隔符”。
          • 在程序运行到要求实际输入时,间隔符的数目不限,按指定的宽度结束,如“%3d”,只取3列。
  • 3.4 字符串的输入输出
    • 3.3.1字符串的输出方法
      • (1)用printf函数
        • 用printf输出字符串时,要用格式符“%s”,输出时从数组的第一个字符开始逐个字符输出,直到遇到第一个‘\0’为止。
        • 例:      
          • char st[15]=“I  am a  boy!”
          • printf(“st=%s,%c,%c”,st,st[3],st[7]);
          • 输出结果:st=Iam a boy!mb
      • (2)用puts函数输出字符串
        • 函数原型:intputs(char * str);
        • 调用格式:puts(str);
        • 函数功能:将字符数组str中包含的字符串或str所指示的字符串输出,同时将'\0'转换成换行符。
        • 例:
          • charch[]="student";
          • puts(ch);  puts("Hello");
        • 将字符数组中包含的字符串输出,然后再输出一个换行符。因此,用puts()输出一行,不必另加换行符'\n'。
      • 函数puts每次只能输出一个字符串,而printf可以输出几个:printf("%s%s",str1,str2);
    • 3.3.2字符串的输入
      • (1)使用scanf函数输入字符串
        • 例:
          • char  st[15];
          • scanf(“%s”,st);
          • 但:scanf(“%s”,&st);是错误的,因为st就代表了该字符数组的首地址。
        • 注:输入时,以回车或空格作为结束标志;
          • 即:用scanf输入的字符串中不能含有空格。
              • 若按如下方法输入:
              • How do  you  do?↙
              • 执行语句:     scanf("%s",st)  ;  则s 的内容为: How\0
              • 使用格式字符串"%s"时会自动加上结束标志'\0'。第一个空格后的字符没有输入st中。
      • (2)使用函数gets()输入字符
        • 函数原型:char   *gets(char *str);
        • 调用格式:gets(str);   str是一个字符数组或指针。
        • 函数功能:从键盘读入一个字符串到str中,并自动在末尾加字符串结束标志符’\0’。
        • 输入字符串时以回车结束输入,这种方式可以读入含空格符的字符串
          • 如:
            • char s[14];
            • gets(s);
            • 若输入的字符串为: How do you do?↙
            • 则s 的内容为:   How do you do?\0
        • 例:字符串输入输出示例
          • #include<stdio.h>
          • main()
          • {chars[20],s1[20];
          • scanf(“%s”,s);
          • printf(“%s\n”,s);
          • scanf(“%s%s”,s,s1);
          • printf(“s=%s,s1=%s”,s,s1);
          • puts(“\n”);
          • gets(s);   puts(s);
          • }
          • 程序运行过程:
          • How doyou do?↙
          • How
          • How doyou do?↙
          • s=How,s1=do
          • How doyou do?↙
          • How do you do?
        • 注意:
          • 1.输出字符不包括‘\0’.
          • 2.用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是元素数组名。
          • 3.如果数组长度大于字符串实际长度,他只输出到遇到‘\0’结束。Char c[10]={“china”};
          • printf(“%s\n”,c);输出china
          • 4.如果一个字符数组中包含两个以上‘\0’,则遇到第一个 时就结束输出。
          • 5.scanf中写字符数组名,不要再加地址符。
          • 6.scanf 和  gets的数据:
            • 如果输入的是  good good  study!
            • 那么scanf(“%s”,a); 只会接收  good.
            • 考点:不可以接收空格。
            • gets(a); 会接收  good good study!
            • 考点:可以接收空格。
  • 3.5 字符数组的输入输出
    • 字符数组的输入输出可以有以下两种方法:
      • (1)用“%c“格式符将字符逐个输入或输出。
      • (2)用“%s“格式符,将整个字符串一次输入或输出。
        • 例如:
        • char c[]= “program“;
        • printf(“%s“,c);
    • 用格式符“%s“输出字符串时,printf()函数中的输出项应该是数组名,而不是数组中的某个元素,如“printf(“%s“,c[0]);“是不对的,应改为“printf(“%s“,c);“。当数组中的字符串的实际长度小于数组定义的实际长度时,在输出时也是遇到'\0'就结束;当数组中有多个'\0'时,遇到第一个'\0'就结束输出。结束符'\0'不被输出。在使用scanf()函数中,输入项是字符数组名。输入项为字符数组名时,不用再加取地址符“&“。因为在C语言中数组名代表该数组的起始地址,如“scanf(“%s“,str);“。

 

 

 

 

 

posted @ 2018-11-24 22:24  Zander_Zhao  阅读(1118)  评论(0编辑  收藏  举报