4.2 赋值语句与输入/输出
1.赋值语句
前面已经介绍了赋值语句是由赋值表达式和末尾的分号(;)构成。这里要提醒读者注意:“=”与“==”是两个不同的运算符,前者才是赋值运算符,而后者是关系运算符,用来进行条件判断,不能把二者混为一谈。例如,“i=2;”,功能是把数值2放到变量i中,而“i==2;”是判断变量i的值是否为2。又如,“j=j+1;”在程序执行时,首先取出j中的值,执行加数值1的操作后再把新值放回到j中。
2.输入与输出概念及其实现
(1)数据从计算机内部向外部输出设备(如显示器、打印机等)输送的操作称为“输出”,数据从计算机外部向输入设备(如键盘、鼠标、扫描仪等)送入的操作称为“输入”。
(2)C语言本身不提供输入/输出语句,但可以通过函数来实现输入和输出的操作。
(3)在使用C语言库函数时,首先要用预编译命令“#include”将有关的“头文件”包含到用户源文件中。这里需要用到编译预处理命令,在后面的章节中还会详细讲到。
3.单个字符的输入1输出
这里介绍C标准 I/O函数库中最简单的对单个字符进行输入/输出的函数putchar()和getchar()。
考点2 字符输出函数putchar()
真考链接
考点2 考查的是字符型输出函数。这个考点有可能会在选择题中的读程序题出现。题目给出一个程序段,然后要求判断或写出(在填空题中)输出结果。此知识点在选择题中的考核概率是20%。
调用putchar和getchar函数时,必须在程序的开头包含进头文件“stdio. h”,如#include<stdio.h>或#include"stdio.h"。
putchar函数的作用是向终端输出一个字符,如putchar(ch);。
它输出字符变量ch的值,ch可以是字符型变量,也可以是整型变量。若ch是整型变量,则输出的是ASCII码值对应的字符。
真题精选
下列给定程序的功能是:调用函数fun()将指定源文件中的内容输出到屏幕。主函数中源文件名放在变量 sfname中,目标文件名放在变量tfname中。
请在标号处填入正确的内容,使程序得出正确的结果。
注意:部分源程序给出如下。不得增行或删行,也不得更改程序的结构。
试题程序
int fun(char *source,char *target)
{ FILE *fs;char ch;
if((fs=fopen(source,"r"))==NULL)
return 0;
printf("\nThe data in file:\n");
ch=fgetc(fs);
while(!feof(fs))
{ putchar(【1】);
ch=fgetc(fs);
}
fclose(fs);
printf("\n\n");
return 1;
}
【答案】【1】ch
【解析】本题考查putchar函数的使用。putchar函数的作用是向终端输出一个字符。例如,putchar(ch);,它输出字符变量ch的值,ch可以是字符型变量,也可以是整型变量。若ch是整型变量,则输出的是ASCII码值对应的字符。
考点3 字符输入函数 getchar()
真考链接
考点3 考查的是字符型输入函数。这个考点考查方式和考点2 相似,都是以读程序题的形式出现,一般要求写出字符输入格式。
此知识点在选择题中的考核概率是60%。
getchar()函数的作用是从终端输入一个字符,getchar()函数没有参数,函数值就是从输入设备得到的字符。
getchar()函数只能接收一个字符,得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一部分。如果在一个函数中(今为main()函数)要调用getchar()和putchar()函数,在该主函数之前的包含命令“#include<stdio.h>”是必不可少的。
小提示
putchar()和getchar()都是针对一个字符输入/输出的函数。如果涉及多个字符,则要使用数组或字符串,后面还会详细讲解到。
常见问题
程序使用getchar()函数实现输入字符,如果在键盘输入abc,则程序得到的字符是什么?
getchar()只能接收一个字符,getchar()函数得到的字符赋给一个字符变量或整型变量,所以赋给变量的只是字符'a'。
真题精选
【例1】若变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是( )。
A.n =0;while((ch =getchar())!='\n')n++;
B.n =0;while(getchar()!='\n')n++;
C.for(n =0;getchar()!='\n';n++);
D.n=0;for(ch=getchar();ch!='\n';n++);
【答案】 D
【解析】A项每进行一次循环判断一个字符是否回车,如果不是就进行下一次判断,因此可以统计出输入字符个数;B项与A项的判断相似,仅为是否将读入的数据赋值给一个变量,因此并不影响判断结果;C项用for循环来判断,与B的判断完全相同,可以统计出输入字符个数;D项中ch=getchar()是给变量ch赋初值,如果输入回车,则程序只循环一次,如果输入一个非回车的字符,则程序进入死循环。因此,本题正确答案为D。
【例2】以下程序的功能是:通过函数func()输入字符并统计输入字符的个数。输入时用字符@作为输入的结束标识。请将有标号的地方填上正确语句。
#include <stdio.h>
long【1】;
main()
{ long n;
n = func();printf("n=% ld\n",n);
}
long func()
{ long m;
for(m=0;getchar()!= '@';【2】)
return m;
}
【答案】【1】func() 【2】m++;
【解析】标号【1】为函数说明语句,其格式为:函数标志符#函数名。标号【2】的m作为计数器,每读一个字符时加1。
【例3】给定程序的功能是:判断字符ch是否与串str中的某个字符相同,若相同什么也不做,若不同则插在串的最后。
注意:部分源程序给出如下。请勿改动函数main()和其他函数中的任何内容,仅在标号处填入所编写的若干表达式或语句。
试题程序
#include <stdio.h>
#include <string.h>
void fun(char *str,char ch)
{ while(*str && *str!=ch)
str++;
if(*str!= ch){
str[0] =ch;
str[1] =0;
}
}
main()
{ char s[81],c;
printf("\nPlease enter a string:\n");
gets(s);
printf("\n Please enter the character to search:");
c=【1】;
fun(s,c);
printf("\nThe result is % s\n",s);
}
【答案】【1】getchar()
【解析】本题考查getchar函数的使用。getchar()函数的作用是从终端输入一个字符,getchar()函数没有参数,函数值就是从输入设备得到的字符。
考点4 格式输出函数printf()
真考链接
不论是在选择题还是在操作题,针对考点4的考查永远都会有,在选择题中的考核概率为90%。只要出现程序,基本都有输出结果,而printf ()这个函数可以根据要求输出各种形式。但是对其输出格式的定义是一个难点。
printf()函数是C语言提供的标准输出函数,它的作用是向终端(或系统隐含指定的输出设备)按指定格式输出若干个数据。
1. printf()函数的一般形式
printf(格式控制,输出表列);
如:printf("%f,%d",x,y);
printf是函数名,括号内由以下两部分组成。
(1)“格式控制”:用双引号括起来的字符串是“格式控制”字符串,它包括两种信息。
①格式转换说明,由“%”和格式字符组成,如 %d、%s等。上例中,当输出项为int型时,系统规定用d作为格式描述字符,因此,有“%d”。当输出项为float或double类型时,用f或e作为格式描述字符。格式描述字符要与输出项一一对应且类型匹配。
②需要原样输出的字符(通常指除了格式说明与一些转义字符外的那部分)也写在“格式控制”内。
(2)“输出表列”:需要输出的一些数据,可以是常量、变量或表达式。例如:
printf("x=% d y=% d",x,y);
其中,"x=%d y=%d"是格式说明;x,y是输出表列。输出表列中的各输出项要用逗号隔开。若x,y的值为7,8,以上两条输出结果为:
x=7 y=8
2. 格式字符
可以根据需要在“%”与格式字符之间插入“宽度说明”、左对齐符号“-”、前导零符号“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位有效位数。
3. 使用printf()函数时的注意事项
(1)在格式控制串中,格式说明与输出项从左到右在类型上必须一一对应匹配,如不匹配将导致数据输出出现错误,如在输出long型数据时,一定要用“%ld”格式控制,而不能用“%d”格式控制。
(2)在格式控制串中,格式说明与输出项的个数也要相等,如格式说明的个数多于输出项的个数,则对于多余的格式将输出不定值(或0值)。
(3)在格式控制串中,除了合法的格式说明外,可以包含任意的合法字符(包括转义字符),这些字符在输出时将被“原样输出”。
(4)如果要输出“%”,则应该在格式控制串中用两个连续的百分号“%%”来表示。
小提示
输出数据的精度并不取决于格式控制中的域宽和小数的位宽,而是取决于数据在计算机内的存放精度。
真题精选
【例1】程序段:intx=12;doubley=3.141593;printf("%d%8.6f",x,y);的输出结果是( )。
A.123.141593 B.⚘⚘⚘⚘⚘⚘123.141593
C.12,3.141593 D.123.1415930
【答案】 A
【解析】本题考查printf函数的输出格式控制符,%m.nf表示指定输出的实型数据的宽度为m(包含小数点),并保留n位小数。但输出数据的小数位大于n时,截去右边多余的小数,并对截去部分的第一位小数做四舍五入处理;当输出数据的小数位小于n时,在小数位的最右边补0,使输出数据部分宽度为n。若给出的总宽度m小于n加上整数位数和小数点,则自动突破m的限制;反之,数字右对齐,左边补空格。本题中3.141593数值长度为8,小数位数为6,因此左端没有空格,故正确答案为A。
【例2】下列给定程序中函数fun()的功能是:将字符串中的字符逆序输出,但不改变字符串中的内容。
例如,若字符串为abcd,则应输出:dcba。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdio.h>
void fun(char * a)
{ if(* a)
{ fun(a+1);
/*****found*****/
printf("% c"*a);
}
}
main()
{ char s[10] = "abcd";
printf("处理前字符串 =% s\n,处理后字符
串=",s);
fun(s);
printf("\n");
}
【答案】printf("%c",*a);
【解析】本题考查:函数定义,本题为有参函数定义。printf函数的一般形式为“printf("格式控制字符串",输出表列);”。
“%d”表示按十进制整型输出。
“%ld”表示按十进制长整型输出。
“%c”表示按字符型输出。
非格式字符串在输出时原样输出,起提示作用。
根据printf函数格式,很容易找到错误之处。
考点5 格式输入函数scanf()
真考链接
考点5在选择题中的考核概率为100%。根据输入的格式判断输出的内容或者根据输出的内容去书写正确的输入格式控制。
考点5在操作题部分的考查很好应付。考生尽量采用无格式输入,这样可以尽可能避免错误。
1. scanf()函数的一般形式
scanf(格式控制,地址表列);
其中,scanf是函数名,“格式控制”的含义同printf()函数;“地址表列”由若干个变量地址组成,既可以是变量的地址,也可以是字符串的首地址(参见“字符数组”一节)。
例如:
scanf("% d",&a);
printf("% d",a);
运行时输入123,按回车键后则会在屏幕上输出整型变量a的值123。其中“%d”是格式控制字符串。&a是输入项。其中的“&”是“取地址运算符”,&a指a在内存中的地址,如需要有多个输入项时,输入项之间要用逗号隔开。在实际输入时,若一次向计算机输入多个数据,则每两个数据间要以一个或多个空格隔开,也可以用回车键或跳格键Tab隔开。
2.格式说明
scanf()函数中的格式说明也是以%开始,以一个格式字符结束,中间可以加入附加的字符。
说明:
(1)对unsigned型变量的数据,可以用 %d、%o、%x格式输入。
(2)在scanf()函数中格式字符前可以用一个整数指定输入数据所占宽度,但对于输入实型数则不能指定其小数位的宽度。
(3)在格式控制串中,格式说明的个数应该与输入项的个数相等,且要类型匹配,如不匹配,系统也不会给出出错信息,但有可能使程序的输出结果不正确。若格式说明的个数少于输入项的个数,scanf()函数结束输入,多余的项继续从终端接收新的数据,若格式说明的个数多于输入项个数,scanf()函数同样也结束输入。
3. 使用scanf()函数时的注意事项
(1)scanf()函数中的输入项只能是地址表达式,而不能是变量名或其他内容,也就是说输入项必须是某个存储单元的地址,这一点一定要掌握。
例如:
int m,n;
scanf("% d,% d",m,n);
是不对的,应将其中的“m,n”改为“&m,&n”。
(2)如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这些字符相同的字符。
(3)在用“%c”格式输入字符时,空格字符和转义字符都可作为有效字符输入。
(4)在输入数据时,若实际输入数据少于输入项个数,scanf()函数会等待输入,直到满足条件或遇到非法字符才结束;若实际输入数据多于输入项个数,多余的数据将留在缓冲区备用,作为下一次输入操作的数据。
在输入数据时,遇到以下情况时认为输入结束:
遇空格、“回车”或“跳格”(Tab)键,上述字符统一可称为“间隔符”。
scanf()函数中的格式控制串是为输入数据用的,其间的字符不能实现原样输出。若想在输入时出现提示性语言,则需要另外使用printf语句。
小提示
1.在编写程序时,考生应尽量少用带格式的输入语句,而要尽量多用带格式的输出语句。
2.在程序运行到要求实际输入时,按指定的宽度结束,如格式控制字符为“%3d”时,则间隔符数目不限,只取输入的前3列。
常见问题
在程序中定义了一个float型的变量x=1.2,使用printf("%10.7f",x)输出,打印在屏幕上的结果是1.20000000,x的类型变化了吗?
只要在程序中定义了x为float型变量,那么其在内存中的存储形式固定不变,即使采用%10.7的格式输出,x也还是float型的变量。
真题精选
【例1】若有定义语句:doublex,y,*px,*py;执行了px=&x;py=&y;之后,正确的输入语句是( )。
A.scanf("%f%f", x, y); B.scanf("%f%f"&x, &y);
C.scanf("%lf%lf", px, py); D.scanf("%lf%lf", x, y);
【答案】 C
【解析】本题考查scanf函数,其格式为:scanf(控制格式,地址表列),其中地址表列中应为要赋值变量的地址。本题要为变量x和y赋值,并定义了两个指针分别指向x和y,因此取得变量x和y的地址的方法有两种。一种是使用取地址符号“&”,即&x和&y;另一种是使用指针变量,即px和py。选项A和D中地址表列错误;选项B中控制格式与地址表列之间应用逗号分开。因此,本题正确答案为C。
【例2】若变量已正确定义为int型,要通过语句scanf("%d,%d,%d",&a, &b, &c);给a赋值1、给B赋值2、给C赋值3,以下输入形式中错误的是(□表示一个空格符)( )。
A.□□□1,2,3<回车> B.1□2□3<回车>
C.1,□□□2,□□□<回车> D.1,2,3<回车>
【答案】 B
【解析】由于scanf格式输入语句中,使用逗号作为输入时的间隔,所以在输入时需要使用逗号隔开。只有选项B中没有使用逗号,故本题选B。
【例3】下列给定程序中函数fun()的功能是:将长整型数中各位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
例如,当s中的数为87653142时,t中的数为7531。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void fun(long s,long *t)
{ int d;
long s1=1;
*t=0;
while(s>0)
{ d=s% 10;
if(d% 2!=0)或if(d% 2==1)
{ *t=d*s1+*t;
s1*=10;
}
s/=10;
}
}
void main()
{ long s,t;
printf("\nPlease enter s:");
/*****found*****/
【1】
fun(s,&t);
printf("The result is:% ld\n",t);
}
【答案】【1】scanf("%ld",&s);
【解析】本题考查scanf函数的使用,scanf()函数的一般形式:scanf(格式控制,地址表列);。