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码值为该变量值的那个字符。
- putchar()函数的作用是向终端输出一个字符。
- 3.2.2字符输入函数getchar()
- getchar()函数的作用是从终端输入一个字符,getchar()函数没有参数,函数值就是从输入设备得到的字符。
- getchar()只能接收一个字符,getchar()函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。如果在一个函数中(今为main()函数)要调用getchar()和putchar()函数,在该主函数之前的包含命令“#include <stdio.h>“是必不可少的。
- 3.2.1字符输出函数putchar()
- 3.3数据格式的输入与输出
- 3.3.1 printf()函数
- 定义
- printf()函数是C语言提供的标准输出函数,它的作用是向终端(或系统隐含指定的输出设备)按指定格式输出若干个数据。遇到控制字符,按照控制字符的规定输出,遇到非格式字符串按原样输出。
- 一般形式:
- printf(“格式控制字符串”,输出列表);
- 如:
- printf(“%f,%d”,x,y);
- 如:
- printf(“格式控制字符串”,输出列表);
- 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位有效位数。
- 可以根据需要在“%”与格式字符之间插入“宽度说明”、左对齐符号“-”、前导零符号“0”等。
- %[flags] [width] [.prec] [hlL] type
- ② 需要原样输出的字符(通常指除了格式说明与一些转义字符外的那部分)也写在格式控制内。
- ① 格式转换说明,由“%”和格式字符组成,如 %d、%s等。上例中,当输出项为int 型时,系统规定用d作为格式描述字符,因此,有“%d”。当输出项为float或double类型时,用f或e作为格式描述字符。格式描述符要与输出项一一对应且类型匹配。
- 用双引号括起来的字符串是“格式控制”字符串,它包括两种信息。
- (2)“输出表列”是需要输出的一些数据,可以是常量、变量或表达式。例如:
- printf(“x=%dy=%d”,x,y);
- 其中,“x=%dy=%d”是格式说明 ; x,y是 输出表列。输出表列中的各输出项要用逗号隔开。若x,y的值为7,8 ,以上两条输出结果为:x=7y=8 在两数之间有空格,因为在两个格式说明符中间有一个空格。
- (1)“格式控制”:
- 使用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列。
- (1)scanf()函数中的输入项只能是地址表达式,而不能是变量名或其他内容,也就是说输入项必须是某个存储单元的地址,这一点一定要掌握。
- scanf()函数的一般形式
- 3.3.1 printf()函数
- 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);
- (1)用printf函数
- 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中。
- 如
- 即:用scanf输入的字符串中不能含有空格。
- 例:
- (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!
- 考点:可以接收空格。
- (1)使用scanf函数输入字符串
- 3.3.1字符串的输出方法
- 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);“。