C语言易错题集合

易错题记录
一、选择题
1
下列表达式中,不满足“当x的值为偶数时值为真,为奇数时值为假”要求的是( )
A: x%20
B: !x%2!=0
C: (x/2*2-x)0
D: !(x%2)
我的答案:C 正确答案:B
解析:
B:当X为2(偶)时,非2为0,0%2
0为假;当X为1(奇)时,非1也为0,0%2
0也为假,故B不能满足题目要求。
C:当X为2(偶)时,为真;当X为1(奇)时,结果为-1!=0为假,所以C满足题目要求。
2
请阅读以下程序:
main()
{
int a=5,b=0,c=0;
if(a=b+c) printf(“***\n”);
else printf(“$$$\n”);
}
以上程序( )。

A: 有语法错不能通过编译
B: 可以通过编译但不能通过连接
C: 输出***
D: 输出$$$

标准答案:D 您的答案:A
解析:
由该题可以知道没有语法错误,故排除A,B。
if后面的判断语句最后结果为将b加c赋给a为0,在判断语句中为0即为假,则不执行下一句语句,所以执行else后面的语句,故答案为D。
3
若希望当A的值为奇数时,表达式的值为”真”,A的值为偶数时,表达式的值为”假”,则以下不能满足要求的表达式是( )。

A: A%21 
B: !(A%2
0)
C: !(A%2)
D: A%2

标准答案:C 您的答案:D
解析:
D:A%2为一个判断语句,当A为偶时结果等于0即为假,当A为奇时结果不为0即为真,故D满足题目要求。
C:C选项即为D选项的反面,跟题目要求不相符合。
4、
若w=1,x=2,y=3,z=4,则条件表达式w<x? w:y<z? y:z的值是( )

A: 4
B: 3
C: 2
D: 1

标准答案:D 您的答案:B
解析:
已有定义,这是一个三目运算符的复合运用。首先w<x为真,执行后一句w即可,后面的就不需要执行了,所以最后结果为1,故D答案正确。
5、
为了避免在嵌套的条件语句 if - else 中产生二义性,C语言规定:else子句总是与( )配对。

A: 缩排位置相同的if 
B: 其之前最近的if
C: 其之后最近的if
D: 同一行上的

标准答案:B 您的答案:A
解析:
在选择结构的嵌套中,应该注意if与else的配对关系,else总是与它上面的最近的未配对的if配对。
6、
以下程序的输出结果是( )。

main()
{int x=2,y=-1,z=2;
if(x<y)
if(y<0) z=0;
else z+=1;
printf(“%d\n”,z);
}

A: 3
B: 2
C: 1
D: 0

标准答案:B 您的答案:D
解析:
由定义可知x<y是错误的,所以不执行内部的if语句,直接跳转执行最后一句输出z的值为2,故结果为B。
7、
设int x,a,b;则下面if语句中错误的是( )

A: if(a=b) x++;
B: if(a=
C: if(a-b) x++;
D: if(x) x++;

标准答案:B 您的答案:C
解析:
由题目可知已有正确定义,而B选项完全就不完整,故错误的是B。
8、
若有说明:int*p1,*p2,m=5,n;以下程序段正确的是( )

A: p1=&m;p2=&p1
B: p1=&n;scanf("%d",*p1)
C: scanf("%d",n); *p1=n
D: p1=&n; *p1=m

标准答案:D 您的答案:B
解析:
B:首先p1指向了n的地址,则p1=&n,*p1=n,所以在输入时应该为scanf("%d",p1);或者scanf("%d",&p1);所以B是错误的。
D:由于p1指向了n的地址,所以
p1相当于n,则 *p1=m相当于把m的值赋给n,所以D是可以的。
9、
下面不能正确进行字符串赋值操作的是( )。

A: char s[6]={“ABCDE”};
B: char s[5]={‘A’,'B’,'C’,'D’,'E’};
C: char *s;s=”ABCDE”;
D: char *s; scanf(“%s”,s);

标准答案:B 您的答案:D
解析:
D:这种先定义再从键盘赋值完全是可以的。
B:定义的字符串长度小了,字符串的最后默认还有一个‘\0’,所以字符串的长度需要改为6,如果不改的话,输出会有乱码,故B答案错误。
10、
若有以下定义,且0≤i<4,则不正确的赋值语句是_______.
int b[4][6], *p, *q[4];

A: q[i] = b[i];
B: p = b;
C: p = b[i]
D: q[i] = &b[0][0];

标准答案:B 您的答案:D
解析:
B:由题目中的定义可知p是针对一维数组的,而b则是二维数组,所以不可以直接这样赋值。
D:而
q[4]是二位指针数组,b也是二维数组,所以D的赋值是可以的。
注意:一个*是针对一维数组,两个**则是针对二维数组的。
11、
若有说明语句
char a[]=“It is mine”; char *p=" It is mine";
则以下不正确的叙述是___________。

A: a+1表示的是字符t的地址
B: p指向另外的字符串时,字符串的长度不受限制
C: p变量中存放的地址值可以改变
D: a中只能存放10个字符

标准答案:D 您的答案:C
解析:
D:a数组没有明确规定存放多少个字符,所以不止可以存放10个字符,故D答案是错的。
C:数组中存放的是值,不可以被改变;而指针是一个变量,它存放的是值的地址,不是值本身,可以被改变,所以C是对的。
12、
有如下语句int a=10,b=20,*p1,*p2;p1=&a;p2=&b;如图1所示,若要实现图2所示的存储
在这里插入图片描述
结构,可选用的赋值语句是( )。
A: *p1=*p2;
B: p1=p2;
C: p1=*p2;
D: *p1=p2;
标准答案:B您的答案:C
解析:
因为p1和p2都是指针变量,所以可以直接不用带星号的赋值,将p2的地址赋给p1。所以B答案是对的。
13、
若有以下定义和语句,则对a数组元素地址的正确引用为________________。
int a[2][3], (*p)[3];
p=a;

A: *(p+2)
B: p[2]
C: *(p[1]+1)
D: (p+1)+2

标准答案:C 您的答案:A
解析:
A中只是取到了二维数组的行,并且p指向了a,则行只是取到了0、1,所以A并没有取到任何东西,所以A是错误的。
C:p[1]是取行,在后面加1是取列,在外面加星号是对二维数组的正确取值,所以C是正确的。
14、
若有说明:int i, j=2,*p=&i;, 则能完成i=j赋值功能的语句是( )

A: i=*p
B: p=&j
C: i=&j
D: i=**p

标准答案:B 您的答案:C
解析:
B:p指向了i的地址, p则是i的值,&则是对j的地址中取值再付给i,所以B是正确的。
C:是将j的地址取出来赋给i,这种写法完全是错误的,并没有把j的值赋给i。
15、
若有说明:char language[]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};
则表达式
language[1]>*language[3]比较的是______________。

A: 字符F和字符P
B: 字符串BASIC和字符串JAVA
C: 字符B和字符J
D: 字符串FORTRAN和字符串PASCAL

标准答案:C 您的答案:B
解析:
在这里的表达式取值指向的是那个字符串的首地址,所以这里比较的就是对应字符串的第一个字符。故C选项是正确的。
16、
下面判断正确的是____________。

A: char *a=“china”;等价于char *a; a=“china”;
B: char str[10]={“china”};等价于char str[10];str[]={“china”};
C: char *s=”china”;等价于char *s; *s=”china”;
D: char c[4]=”abc”,d[4]=”abc”;等价于char c[4]=d[4]=”abc”;

标准答案:A 您的答案:D
解析:
A:指针变量可以在定义时初始化(赋初值),也可以在定义之后再初始化。
B:字符串数组必须在定义的时候就初始化,否则就要从键盘上输入给它初始化。
C:指针变量只能存放地址,不是把字符串赋给*s,只是把”china”的第一个字符的地址赋给指针变量s。在C语言中只有字符变量,没有字符串变量。所以应该是等价于char *s; s=”china”。
D:字符数组之间不可以直接互相这样赋值。
17、
若有定义int a[]={10,20,30,40}, p=a;,当执行p++;后,输出(++p)的值为( )。

A: 10
B: 20
C: 30
D: 40

标准答案:C 您的答案:B
解析:
首先执行p++则代表先取的是p[0]的值,然后p+1,输出*(++p)时,先p+1,在输出*p的值,所以就是取p[2]值,即为30,故C答案正确。
18、
若有以下定义和赋值语句,则对b数组的第i行第j列(假设i,j已正确说明并赋值)元素的非法引用为______________。
int b[2][3]={0}, (*p)[3];
p=b;

A: ((p+i)+j)
B: *(p[i]+j)
C: (p+i)+j
D: (
(p+i))[j]

标准答案:C 您的答案:D
解析:
C:取的是地址,如果需要取值则要像A选项一样再套个星号。
D:: (*(p+i))取的是第i行的元素,后面的[j]取的是第j列的元素,因此这种写法完全是合法的。
19、
若有定义:int a[2][3];则对a数组的第i行第j列(假设i,j已正确说明并赋值)元素
值的正确引用为_____________。

A: ((a+i)+j)
B: (a+i)[j]
C: *(a+i+j)
D: *(a+i)+j

标准答案:A 您的答案:D
解析:
D:取的是地址,如果需要取值则要像A选项一样再套一个星号。所以D选项错误,A选项是正确。
20、
已有函数max(a,b),为了使函数指针变量p指向函数max,则下面选项中赋值方法正确的是( )。

A: p=max
B: *p=max
C: p=max(a, b)
D: *p=max(a, b )

标准答案:A 您的答案:D
解析:
指针变量指向的是一个地址,而函数名本身也可以当做一个地址,所以p只需要指向函数名即可,故A答案正确。
21、
已定义以下函数
fun(char *p2, char *p1)
{ while((*p2=*p1)!=’\0’){p1++;p2++;}
}

A: 将p1所指字符串复制到p2所指内存空间
B: 将p1所指字符串的地址赋给指针p2
C: 对p1和p2两个指针所指字符串进行比较
D: 检查p1和p2两个指针所指字符串中是否有’\0’

标准答案:A 您的答案:D
解析:
排除法: 在这个题目中加*表示的是取值,不加则表示的是取地址,所以B答案可以排除,这里也没有字符串的比较函数strcmp(),所以C错误;也没有字符串复制函数strcmp(),所以A错误。由排除法可以知道D正确。
正面:p1和p2指向的是同一个字符串,当这个字符串中的单个字符串不等于‘\0’才可以进入循环里面,所以是检查字符串是否有‘\0’。所以D正确。
22、
宏定义#define PI 3.1415926的作用是:指定用标识符PI来代替一个( )。

A: 单精度数
B: 字符串
C: 双精度数
D: 整数

标准答案:B 您的答案:C
解析:
宏的具体定义是: #define 标识符 字符串。
23、
若有赋值语句p=(double*)malloc(10*sizeof(double));,则正确的定义语句是( )

A: double *p
B: float **p
C: double **p
D: float *p

标准答案:A 您的答案:C
解析:
用malloc函数开辟动态存储区的函数原型为:
void *malloc(unsignde int size);
所以正确的定义是定义一个malloc前面括号中类型的变量,即double *p。malloc后面的括号中是为p变量开辟的动态空间的大小。
24、
已定义以下函数:
int fun(int *p){return *p;}

fun函数返回值是 ( )

A: 一个整数
B: 形参p的地址值
C: 形参p中存放的值
D: 不确定的值

标准答案:C 您的答案:A
解析:
在函数中传入的形参是一个指针变量,之后return 返回的值是这个指针变量中所存放的值。而A答案一个整数太笼统,地址也可以是一个整数,所以选C答案更加全面具体。
25、
C语言提供的合法关键字是( )。

A: swicth
B: chan
C: Case
D: default

标准答案:D 您的答案:A
**解析:**由ANSI标准定义的C语言关键字共32个 :
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static
A中swicth不是switch,所以A错误。
C:case要小写,选项中大写了所以是错的。
所以D正确。
26、
fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是( )

A: 只写
B: 追加
C: 读或读写
D: 答案b和c都正确

标准答案:C 您的答案:D
解析:
因为是从指定文件读入一个字符所以一定要有读,而追加的意思是向文本文件尾添加数据,所以只有C答案是正确的。
27、
若a、b、c1、c2、x、y均是整型变量,正确的switch语句是( )。
A) swich(a+b);            B) switch(aa+bb)
{case 1:y=a+b; break; {case 3:
case 0:y=a-b; break; case 1:y=a+b;break;
} case 3:y=b-a;break;
}
C) switch a              D) switch(a-b)
{case c1 :y=a-b; break; {default:y=ab;break;
case c2: x=a
d; break; case 3:case 4:x=a+b;break;
default:x=a+b; case 10:case 11:y=a-b;break;
} }

A: 在题目中
B: 在题目中
C: 在题目中
D: 在题目中

标准答案:D 您的答案:C
解析:
A:swich表达式后面多了个分号。
B:里面的执行语句中不能重复出现相同的常量,否则会矛盾。
C:case后面的不能是变量,必须是常量。
故只有D答案正确。
28、
下列可以作用C语言常量的是()

A: " "
B: ‘ab’
C: 二进制10010001
D: 3.0E

标准答案:A 您的答案:D
解析:
B:不能写成‘ab’,只能是分开的‘a’,‘b’。(这是普通字符:用单撇号括起来的一个字符)
C:转义字符中有八进制字符,十六进制字符,没有二进制的转义字符。
D:有E的为指数形式的常量。规定以字母e或E代表以10为底的指数,在它们之前必须有数字,并且之后必须为整数,所以D这样的写法是错误的,E之后没有数字。
故只有A是正确的,空格也是一个字符。
29、
若要用fopen函数打开一个新的二进制文件,该文件要既能读也能写,则文件方式字符串应是( )

A: “ab+”
B: “wb+”
C: “rb+”
D: “ab”

标准答案:B 您的答案:C
解析:
C:是为了读和写打开一个已存在的二进制文件。
B:为了读和写建立一个新的二进制文件。
题目要求是打开一个新的二进制文件即为新建,所以选B是正确的。
30、
有以下定义:
char x[ ]=“abcdefg”;
char y[ ]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’};
则正确的叙述为( )。

A: 数组x和数组y等价
B: 数组x和数组y的长度相同
C: 数组x的长度大于数组y的长度
D: 数组x的长度小余数组y的长度

标准答案:C 您的答案:D
解析:
由于字符串会自带\0,而字符数组如果不添加\0,则是不会有\0。而strlen计算字符串长度的函数只会在遇到\0才结束,所以这里只能用sizeof计算字符串的长度。结果为x=8,y=7.所以最后的答案是C答案正确。
**注意:**在计算长度时strlen不会把\0计算在内,sizeof则会把\0计算在内。

31、
以下程序的输出结果是( )。
main()
{char w[ ][10]={“ABCD”,“EFGH”,“IJKL”,“MNOP”},k;
for(k=1;k<3;k++) printf("%s\n", &w[k][k]);
}
A) ABCD     B) ABCD     C) EFG     D) FGH
FGH EFG JK KL
KL IJ O
M

A: 在题目中
B: 在题目中
C: 在题目中
D: 在题目中

标准答案:D 您的答案:C
**解析:**如图所示,首先输出的是w[1][1]的字符串FGH,然后输出的是w[2][2]的字符串KL,所以好好看选项是选择D答案正确的。
32、
在下列形式的常数中,C程序不允许出现的是( )。

A: .45
B: ±123
C: 25.6e-2 
D: 4e3

标准答案:B 您的答案:D
解析:
A:是常量,允许出现的。
B:在C语言中不允许像数学中一样同时表达一个数的正负,所以应该选择B答案。
C、D:都是表示指数形式的常量,书写格式正确。
33、
以下关于return语句的叙述中正确的是( )

A: 一个自定义函数中必须有一条return语句
B: 一个自定义函数中可以根据不同情况设置多条return语句
C: 定义成viod类型的函数中可以有带返回值的return语句
D: 没有return语句的自定义函数在执行结束时不能返回到调用处

标准答案:B 您的答案:A
解析:
A:不一定就必须要有一条return语句,如果自定义的返回类型为空的话,那么就不需要return语句。
B:虽然在函数中遇到return 语句就会结束,但是并没有规定自定义函数中只能有一条return语句,所以B正确。
C:定义为void类型的函数就不需要return语句了。
D:错误的说法,函数的调用从main函数开始,也从main函数结束的。
34、
若要求在if后一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表达式为( )。

A: a<>0
B: !a
C: a=0
D: a

标准答案:D 您的答案:A
解析:
首先排除B、C选项完全不符合题目要求。
if后面为判断语句,判断语句是在为0时为假不执行语句,在为非0时为真,执行语句,,所以表示a不等于0,只需要在if后面写a就可以了。所以应该选择D答案。
35、
设变量n为float型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是()

A: n=(n100+0.5)/100.0
B: m=n
100+0.5,n=m/100.0
C: n=n*100+0.5/100.0
D: n=(n/100+0.5)*100.0

标准答案:B 您的答案:A
解析:
A:答案中最后的结果保留了三位小数,不符合题意。
B:因为m为int型,所以在给m赋值后会舍弃小数点后的数,保留整数部分,所以最后的结果是保留了两位小数,符合题意,所以B答案正确。
36、
以下选项中合法的用户标识符是( )。

A.long
B._2Test
C.3Dmax
D.dat

正确答案
B
解析:
[解析] long为C语言的保留字,不能作为用户标识符,故选项A错误。3Dmax开头的第一个为数字,而C语言规定,第一个字符必须为字母或者下划线,故选项C错误;A.dat中的字符“.”不符合C语言中用户标识符只能由字母、数字和下划线组成的规定,故选项D错误。只有选项B正确。

二、判断题
1、

C语言中,为了区别一般的变量,符号常量必须用大写字母表示 ( )
标准答案:N 您的答案:Y

解析: 为了区分符号常量和一般的变量,习惯上符号常量用大写表示,如PI等,但是并不是所有符号常量都必须用大写表示,也可以用小写,并不是强制性的规定。

2、

指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。
标准答案:N 您的答案:Y

解析: 该题是错误的,指针所保存的变量的地址跟它本身的地址是不一样的。

3、

字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。
标准答案:Y 您的答案:N

**解析:**字符指针既然指向字符串,那么就可以用字符串常量给字符指针赋值,但是不可以直接给指针变量名赋值。

4、

int a=5,*p;p=&a;则p的值为5.
标准答案:N 您的答案:Y

解析: 定义了a和指针变量,指针变量又指向a的地址,即为*p的值为5,p的值为变量a的地址。

5、

C语言中,执行表达式(*p)++后p的指向改变了。
标准答案:N 您的答案:Y

解析:
p是一个指针变量,指向的永远是首地址不会改变。在这里首先对*p取值再++,改变的是p指向的那个地址里面的值。

6、

语句*–p;执行之后p指向的内存单元被改变。
标准答案:N 您的答案:Y

解析:
p是一个指针变量,指向的永远是首地址不会改变。在这里首先执行的是p–,然后再对p取值,但是p只想你的内存单元没有被改变。

7、

指针可以加上或减去一个int型数,也可以加上一个指针。
标准答案:N 您的答案:Y

解析:
指针变量不能相加、相乘或相除,如果两个指针变量指向的是同一块连续空间中的不同存储,则可以相减。指针变量的相加完全没有任何意义。

8、**

若有以下说明:int a[5][9];则下列选项中对数组元素a[i][j]的引用是错误的有*(a+i)[j].(0<=i<4,0<=j<9)
标准答案:N 您的答案:Y

解析:
这种对二维数组的引用完全是合法的。a+i是对第i行元素地址的引用,在前面加*就是取值的意思,后面的[j]是对第j列元素的引用。所以这种引用是正确的。

9、

函数指针所指向的是程序代码区。
标准答案:Y 您的答案:N

解析:
正如整型指针变量指向的是整型变量的地址,函数指针指向的自然是函数的地址(函数名),从函数的地址可以进入到函数的程序代码区,所以这种说法是正确的。

10、

通过变量名或地址访问一个变量的方法称为“直接访问”方式。
标准答案:Y 您的答案:N

解析:
直接访问:直接按变量名进行的访问。
间接访问:将i变量的地址存放在另一个变量中,然后通过该变量来找到变量i的地址,然后再访问i变量。
所以这里说的访问方式就是直接访问,正确。

11、

设有如下定义:
  char *s[2]={“abcd”,“ABCD”};
  则s数组元素的值分别是“abcd”和“ABCD”两个字符串的首地址
标准答案:Y 您的答案:N

解析:
在本题中 指针数组s指向的就是字符串的首地址,如果加上*才是取值的意思。所以该题说的s数组元素的值就是两个字符串的首地址(即为数组s的首地址)。

12、

语句“int p;”中的p的含义为取值。
标准答案:N 您的答案:Y

解析:
在定义一个指针变量的时候*p的含义是定义了一个名为p的指针变量只能存放int类型变量的地址。

13、

指针、数组名、函数名都是地址。
标准答案:Y 您的答案:N

解析:
指针本身存放的就是地址,所也可以说指针就是地址。
数组名也默认表示数组的首地址,所以数组名也是地址。
函数名即为函数程序代码的地址,也是地址。
所以它们都是地址。

14、

我们可以使用ftell获得文件的当前读写位置。
标准答案:Y 您的答案:N

解析:
long ftell(FILE *fp)函数的作用就是返回fp所指向的文件中的读写位置(也就是返回当前位置)。所以该判断是正确的。

15、

在数组定义后,可以使用语句如iSum[]={1,2,3};给数组初始化。
标准答案:N 您的答案:Y

解析:
定义数组时需要在定义时就给数组初始化,否则就需要从键盘上给数组初始化。

16、

C语言共用体类型变量在程序运行期间只有一个成员驻留在内存中
标准答案:Y 您的答案:N

解析:
共用体类型数据的特点:同一个内存段可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一个成员,而不是同事存放几个。因为在每一瞬间,存储单元只能有唯一的内容,也就是说在共用体变量中只能存放一个值。

17、

可以把结构体数组元素作为一个整体输出。
标准答案:N 您的答案:Y

解析:
不可以,因为结构体数组中的每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项。

18、

C语言中,结构类型与结构变量的含义一样,都可以用来存放数据。
标准答案:N 您的答案:Y

解析:
不一样,结构体在声明类型的同时定义变量的形式为:
struct (结构类型) 结构体名
{
成员表列
}变量名列表;
定义结构体时需要先申明结构体类型,再定义改类型的变量。

19、

结构体变量作参数时是地址传递。
标准答案:N 您的答案:Y

解析:
结构体的定义相当于全局变量,结构体变量作为参数时传的不是地址而是值。

20、

结构体数组不可以在定义时进行初始化。
标准答案:N 您的答案:Y

解析:
结构体数组是可以在定义的时候接着后面给它进行初始化的。

21、

若有以下说明和语句:
struct Student
{
int num;
int age;
}stu,p;
p=&stu;
则可以用
p.age引用stu中成员age
标准答案:N 您的答案:Y

解析:
因为p为指针,所以正确的引用应该是p->age。

22、

C语言中,关键字enum可用于结构类型的定义。
标准答案:N 您的答案:Y

解析:
enum是用于枚举类型的申明:
enum [枚举名]
{
枚举元素列表
}

三、填空题
1、
设x,y,z均为int型变量;写出描述“x,y和z中有两个为负数”的C语言表达式:
标准答案:
(x<0&&y<0&&z>0)||(x<0&&y>0&&z<0)||(x>0&&y<0&&z<0)
您的答案:
(x<0&&y<0&&z>0)||(x<0&&z<0&&y>0)||(x>0&&y<0&&z<0)
**解析:*逻辑运算符中如果前面的错误的话就不会接着去判断后面的了,所以变量的顺序不可以随便改变。
2、
设double x=2.5,y=4.7;int a=7;则x+a%3
(int)(x+y)%2/4为

标准答案:
2.5
您的答案:
2.500000
**解析:**由于输出的方式不同,用%lf输出后面有0,用%g输出就是后面没有0。
3、
已有int i,j;float x;为将-10赋给i;12赋给j,410.34赋给x;则对应的scanf函数调用语句的数据输入形式
___。
标准答案:
scanf("%d%d%f",&i,&j,&x);
您的答案:
scanf("%d
%d
%f",i,j,x);
**解析:**输入时必须要写取地址符,并且一般输入没有要求用空格隔开的就不需要有空格隔开。
4、
若两个指针变量指向同一个数组的不同元素,则可以进行减法运算和____运算。
标准答案:
赋值&!@关系
您的答案:
加法
解析:
指针之间不可以进行加法运算,指针之间的加法完全没有任何意义。
5、
下面的程序中有一函数求两个整数之和,并通过形参传回结果。请在横线上填入相应的代码
#include <stdio.h>
void add(int x,int y,int *z)
{
*z = x+y;
}
int main()
{
int i,j,k;
scanf("%d%d",&i,&j);
add(i,j,_______);
printf("%d\n",k);
return 0;
}

标准答案:
&k
您的答案:
k
解析:
在传参的时候注意变量的类型,int *z指向的应该是k的地址,所以传的时候应该是&k。
6、
判断文件是否到达文件末尾的函数是
标准答案:
feof()
您的答案:
EOF
解析:
判断文件是否到大文件末尾的方式:
(1)fscanf()函数返回值为EOF或者fgets()函数的返回值为NULL时。
(2)利用feof()函数当返回1时表示文件已到达末尾EOF处。

四、编程题
1、
安全密码
题目描述
密码:密码被盗,后果很严重。现在发现安全的密码至少应该满足下面两个条件:
(1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。

这四个字符类别分别为:
1.大写字母:A,B,C…Z
2.小写字母:a,b,c…z
3.数字:0,1,2…9;
4.特殊符号:~,!,@,#,$,%,^

给你一个密码,你的任务就是判断它是不是一个安全的密码。
输入
先输入一个密码个数N,接下来N行,每行输入一个密码。
输出
判断这N行的密码是否是安全密码,是安全密码就输出“YES”,否则输出“NO”。 请注意行尾输出换行。

样例输入
3
a1b2c3d4
Linle@ACM
~@^@!%
样例输出
NO
YES
NO

#include <stdio.h>
#include <string.h>
void na(char a[])
{
 int b=0,c=0,d,i,e=0,f=0,n;
 d=strlen(a);
 if(d<6) 
  printf("Not Safe\n");
 else {for(i=0;i<d;i++)//根据ASCII码判断
  if(a[i]<58&&a[i]>47) b=1;
  else if(a[i]>64&&a[i]<91) c=1;
  else if(a[i]>96&&a[i]<123) e=1;
  else f=1;}
 n=b+c+e+f;
 switch(n)
 {
 case 1:printf("Not Safe\n");break;
 case 2:printf("Medium Safe\n");break;
 case 3:printf("Safe\n");break;
 case 4:printf("Safe\n");break;}
}
int main()
{
 char a[21];
 int j,k;
 scanf("%d\n",&j);
 for(k=0;k<j;k++)
 {
  gets(a);na(a);
 }
}

2、
字符串中子串出现次数
题目描述:
现在有一行字符串,称为主串,可以假定为一行长度不超过80的字符串,,同时有一个子串,要求计算子串在主串中出次的次数
输入
输入只有两行,每行以回车结束,第一行为主串,第二行为子串,输入的字符个数不超过80个。
输出:
用一行输出子串在主串中出现的次数
样例输入;
ab c147de fgh 11472 789
147
样例输出:
2

#include<stdio.h> 
int Count(char  *str, char  *substr)
{ 
 int n = 0; 
 char *p, *q;
 while (*str) 
 {  
  p = str;
  q = substr;
  while (*q)
  {   
   if (*p == *q)  
   {    
    ++p; 
    ++q;  
   }   
   else   
   {   
    break; 
   }    
  }   
  if ('\0' == *q)  
  {  
   ++n;  
  }  
  ++str;
  } 
 return n;
} 
int main()
{ 
 int n;
 char str[1000], substr[3] ;
 gets(str);
 gets(substr);
  n = Count(str, substr);
 printf("%s在%s出现的次数为:%d", substr, str, n);
 return 0;
}
**3、`**`
`字符串*号的移动
题目描述:
现在有一行字符串,以回车结束,字符串中可以包含数字、大小写字母、标点等符号,要求将所有的*号移到到字符串的开头,并输出新的字符串。
输入
输入多个用例,第一行为用例数,接下来每个用例只有一行,每行以回车结束,每行字符个数不超过80个。
输出:
每一个用例,用一行输出新的字符串
样例输入;
2
123456******
*a*bc***edf
样例输出:
******123456
*****abcedf

#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,k,l;
char s[20],a[20],b[20];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",s);
k=0;
l=0;
for(j=0;j<strlen(s);j++)
{
if(s[j]==’*’)
{
b[k]=s[j];
k++;
}
else
{
a[l]=s[j];
l++;
}
}
b[k]=’\0’;
a[l]=’\0’;
printf("%s\n",strcat(b,a));
}

return 0;

}





 
 
 

 





  • 5
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值