C语言程序错题
1.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。
答:对。我的理解产生了错误。误以为返回值的是ascii码的大小。事实上int大于0则是1,小于则是-1。
2.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。
答:错。数组名是地址,不是指针常量,它的值可以赋给指针。
3.有说明语句int a[4][5];,则a[2]+3表示 A 。
A.a数组行下标为2、列下标为3的元素的地址
B.0a数组行下标为2、列下标为3的元素的值
C.a数组第2行的首地址
D.a数组第3行的首地址
答:a[2]表示地址。+3表示地址后移3个元素。
4.语句int *p; *p=50;执行时,不会有任何错误。
答:错。在执行时,*P没有值。printf不出来任何值。5
5.定义FILE *fp; 则文件指针fp 指向的是(B)。
A.文件在磁盘上的读写位置
B.文件在缓冲区上的读写位置
C.整个磁盘文件
D.文件类型结构体
6.int (*p)[4]它表示p是一个指针数组,它包含4个指针变量元素.
答:错。p为指向包含4个元素的一维数组的指针变量。它只是一个指针。
7.设变量定义为 int a[2]={1,3}, p=&a[0]+1;,则p的值是( B)。(2分)
A.2
B.3
C.4
D.&a[0]+1
答:p在定义时赋值,意为将&a[0]+1赋给了p。且,a为int型,所以+1就是a向后加了一个元素大小的位置。故等于a[1]的值。
8.根据声明int a[10], *p=a; ,下列表达式错误的是( D)。 (2分)
A.a[9]
B.p[5]
C.a++
D.*p++
答:a为数组首地址的值,是常量。不能自加。
9.数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。
答:错。数组名代表数组首地址,与指针常量无关。
10.有说明语句int a[4][5];则a[2]+3表示
A.a数组行下标为2、列下标为3的元素的地址
B.a数组行下标为2、列下标为3的元素的值
C.a数组第2行的首地址
D.a数组第3行的首地址
答案:A.因为a[2]是取二位数组a[2]的地址,+3是表示按照int 类型地址+3.所以答案为地址,且数组下标是以0开始,则0+3=3,答案为A.
11.以下哪个定义中的p不是指针,请选择恰当的选项: (C)
A.char **p;
B.char (*p)[10];
C.char *p[6];
D.给出的三项中,p都是指针
答:*p[6]代表指针数组,其中的元素才代表指针。
12.语句int *p; *p=50;执行时,不会有任何错误(F)
答:P需要指向一个地址后才能对 *p赋值.
13.对于定义 char str[] = “abc\000def\n”(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是: (C)
A.12 ,13
B.3 ,11
C.3 ,9
D.3 ,4
答:\0XX为八进制,当XX为1-77时。\000视为\0,strlen为3。sizeof是全部占用的大小,与\0无关,则为12.
14.若定义pf为指向float类型变量f的指针,下列语句中(B)是正确的。
A.float f, *pf = f;(地址没有浮点型的)
B.float f, *pf = &f;
C.float *pf = &f, f;
D loat f, *pf =0.0;
解析:定义时初始化float *pf = &f;的等价的语句是: float *pf; pf = &f;.
15.在下列形式的常数中,C程序不允许出现的是( B )。
A: .45
B: ±123
C: 25.6e-2
D: 4e3
答案:
A:是常量,允许出现的。
B:在C语言中不允许像数学中一样同时表达一个数的正负,所以应该选择B答案。
C、D:都是表示指数形式的常量,书写格式正确。
16.下列可以作用C语言常量的是(A)
A: " "
B: ‘ab’
C: 二进制10010001
D: 3.0E
答:
B:不能写成‘ab’,只能是分开的‘a’,‘b’。(这是普通字符:用单撇号括起来的一个字符)
C:转义字符中有八进制字符,十六进制字符,没有二进制的转义字符。
D:有E的为指数形式的常量。规定以字母e或E代表以10为底的指数,在它们之前必须有数字,并且之后必须为整数,所以D这样的写法是错误的,E之后没有数字。
17.如果二进制文件a.dat已经存在,现在要求写入全新数据,应以(B)方式打开。
A.“w”
B.“wb”
C.“w+”
D.“wb+”
答:首先是dat(二进制)文件,必须带b。全新文件,不能有+号,故选B。
18.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是(A)。
A.p->next=h
B.p->next=NULL
C.p->next->next=h
D.p->.data=-1
答:p 指针指向链尾那么p即为尾指针,循环链中尾指针下一个指向头指针。
19.对于以下结构定义,++p->str中的++加在 A。 (2分)
struct
{
int len;
char *str;
} *p;
A.指针str上
B.指针p上
C.str指的内容上
D.以上均不是
答:因为p->str是对指针str的引用。
20.以下哪个定义中的p不是指针,请选择恰当的选项: C
A.char **p;
B.char (*p)[10];
C.char p[6];
D.给出的三项中,p都是指针
答:[]的优先级高于,所以P先于[]结合,所以P是一个数组。数组里存放的元素都是指针。
21.c语言源程序是文本文件,目标文件和可执行文件是二进制文件。
答:对。只有二进制文件。才能被机器所识别。
22.以下不能对二维数组a进行正确初始化的语句是( C)
A: int a[2][3]={0}
B: int a[ ][3]={{1,2},{0}}
C: int a[2][3]={{1,2},{3,4},{5,6}}
D: int a[][3]={1,2,3,4,5,6}
答 :A整体赋值为0 B相当于a[2][3]={{1,2},{0}} C明显越界了 应该是a[3][2]={{1,2},{3,4},{5,6}}D相当于a[2][3]={1,2,3,4,5,6}
23.判断闰年
键盘输入一个四位数的年份,判断该年是否为闰年。闰年即如果是整百年,要求能被400整除,如果不是整百年,则能被4整除。如2000年是闰年,1900年不是闰年,1996年是闰年。如果是闰年,输出“OK”,否则输出“NO”。
样例输入:
1990
样例输出:
NO
#include <stdio.h>
int main()
{
int i;
scanf("%d",&i);
if((i%100==!0&&i%4==0)||i%400==0)
{
printf("OK");
}
else
printf("NO");
return 0;
}
解析:这题主要是在对if语句的考察,在对闰年的判断上要注意;
24.判断是否为偶数
键盘输入一个整数,判断该整数是否为偶数,如果是,输出“YES”,如果不是,输出“NO”。
样例输入:
87
样例输出:
NO
#include <stdio.h>
int main()
{
int i;
scanf("%d",&i);
if(i%2==0)
{
printf("YES");
}
else
printf("NO");
return 0;
}
解析:这题也是对if语句的考察,只要做好判断,这一题就能很轻松的解决
25.求从1开始加刚好超过某值的值
键盘输入一个整数,要求从1开始加,直到和刚好超过输入的数,输出刚好超过的和值和最后加的数,用一个空格隔开。例如输出20时,1+2+3+4+5+6=21,刚好超过了20,则输出21,最后加的数为6。
样例输入:
20
样例输出:
21 6
提示:可以使用for或while或do while循环实现。
#include<stdio.h>
int main()
{
int n, sum, i;
scanf("%d", &n);
i = 0; sum = 0;
while (sum <= n){
i++;
sum+=i;
}
printf("%d %d\n", sum, i);
return 0;
}
解析:这一题是对循环语句的考察,只要写好跳出循环的条件,就能完成此题