C语言错题集

王德华的C语言错题集


一、选择题
(1).若有定义:int *p[4];则标识符p是()。
A: 是一个指向整型变量的指针
B: 是一个指针数组名
C: 是一个指针,它指向一个含有四个整型元素的一维数组
D: 定义不合法
标准答案:B,您的答案:A
解析:p是一个具有4个元素的指针数组,每一个元素是一个int型指针
(2).下面判断正确的是 ()。
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,您的答案:C
解析:A:指针变量可以在定义时初始化(赋初值),也可以在定义之后再初始化。
B:字符串数组必须在定义的时候就初始化,否则就要从键盘上输入给它初始化。
C:指针变量只能存放地址,不是把字符串赋给
s,只是把”china”的第一个字符的地址赋给指针变量s。在C语言中只有字符变量,没有字符串变量。所以应该是等价于char *s; s=”china”。
D:字符数组之间不可以直接互相这样赋值。
(3).若有说明:int i, j=2,*p=&i;, 则能完成i=j赋值功能的语句是()
A: i=p
B: p=&j
C: i=&j
D: i=**p
标准答案:B,您的答案:C
解析:题目中
p指向i的地址,B选项中是指向了j的地址中的值。
(4).如果x是整型变量,则合法的形式是( )。
A: &(x+5)
B: *x
C: &*x
D: *&x
标准答案:D,您的答案:B
解析:D为指向存放X的地址的值。B:不可以直接指向整型变量。
(5).若有定义: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
解析:B:应该改为
(a+i)[j]才是正确的引用。C和D都是错误的表达形式。
(6).下面不能正确进行字符串赋值操作的是( )。
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,您的答案:C
解析:B中有一结束符‘|0’,所以它的长度为6.
(7).以下程序有错,错误原因是()。
main()
{int *p,i;
char *q,ch;
p=&i; q=&ch; p=40; p=q;

}
A: p和q的类型不一致,不能执行p=q;语句
B: p中存放的是地址值,因此不能执行p=40;语句
C: q没有指向具体的存储单元,所以
q没有实际意义
D: q虽然指向了具体的存储单元,但该单元中没有确定的值, 所以不能执行p=q; 语句
标准答案:A,您的答案:C
解析:p是一个变量,而q是一个地址。二者类型不同。
(8).语句int(prt)();的含义是()。
A: prt是一个指向一维数组的指针变量
B: prt是指向int型数据的指针变量
C: prt是指向函数的指针,该函数返回一个int型数据
D: prt是一个函数名,该函数的返回值是指向int型数据的指针
标准答案:C,您的答案:D
解析:int(prt)()是一个数组指针,所以prt是指向函数的指针,该函数返回一个int型数据。
(9).若有以下说明和语句: char
language[]={“FORTRAN”,“BASIC”,“PASCAL”,“JAVA”,“C”};
char * * q;
q=language +2;则语句printf ("%o\n",
q )()。
A: 输出的是language[3]元素的地址
B: 输出的是字符串PASCAL
C: 输出的是language[2]元素的值,它是字符串PASCAL的首地址
D: 格式说明不正确,无法得到确定的输出
标准答案:C,您的答案:D
解析:language指的是language[0]元素,q=language +2表示language[2]元素的值,它是字符串PASCAL的首地址。所以选择C。
(10).在下列叙述中,错误的一条是( )。
A: 全局变量存放在静态存储区中,在程序开始执行时就给全 局变量分配存储区,程序执行完才释放
B: 在有参函数中,形参在整个程序一开始执行时便分配内存单元
C: 用数组名作函数实参和形参时,应在主调用函数和被调用函数中分别定义数组
D: 在同一个源文件中,全局变量与局部变量同名时,在局部变量的作用范围内,全局变量不起作用
标准答案:B,您的答案:D
解析:形参变量只有在被调用时才分配内存单元,所以B是错误的。
(11). 在VC编辑环境下设有变量说明: int a=0,b=0;则表达式sizeof(a+b)的值是( )
A: 1
B: 2
C: 4
D: 8
标准答案:C,您的答案:D
解析:a+b指的是相加,结果还是int型,表达式sizeof(a+b)指的是变量类型的大小。所以答案选C。
(12).设有以下语句:
struct st{int n; struct st *next;};
static struct st a[3]={5, &a[1], 7, &a[2], 9, ‘\0’},*p;
p=&a[0];
则表达式( )的值是6。
A: p++ ->n 
B: p->n++
C: (*p).n++
D: ++p->n
标准答案:D,您的答案:A
解析:p++是先取值,在自增。++p先自增,在取值。所以选择D。
(13).若x是整型变量,pb是基类型为整型的指针变量,则正确的赋值表达式(A).
A: pb=&x;
B: pb=x;
C: *pb=&x;
D: *pb=*x
标准答案:A,您的答案:D
解析:pb是指针变量,只能用来存放地址,故选择A。

二、判断题**
(1).指针是变量,它具有的值是某个变量或对象的地址值,它还具有一个地址值,这两个地址值是相等的。 答案:错误
解析:指针的地址和指针所指向变量的地址是不同的概念,所以二者是不同的。
(2).两个指针在任何情况下相减都是有意义的 答案:正确
解析:两个指针相减是有意义的,但是相加是没有意义的。
(3).字符指针是指向字符串的指针,可以用字符串常量给字符指针赋值。 答案:正确
(4).语句*–p;执行之后p指向的内存单元被改变。答案:错误
解析: 语句执行后是指p指向的地址发生改变,但是原来指向的值是不会改变的。
(5).一个指针变量的值是一个地址值。 答案:正确
(6).指针可以加上或减去一个int型数,也可以加上一个指针
答案:错误
解析: 指针相减是要保证类型相同才有意义。
(7).函数指针所指向的是程序代码区。 答案:正确
(8).定义:char p[20]; 则,p, &p[0] 两者没有区别
答案:正确
(9).函数原型说明中,省略形参变量或者将形参变量写成其它名称不影响程序的正确性。 答案:正确
(10).对于数值型数组来说,可以引用整个数组。答案:错误
解析:数组名就是首地址,而里面的元素在内存当中的其它N个地址,你访问数组名的时候是访问的首地址。而不会访问其它元素
(11).C语言中,用格式符"%s"输入字符数组时,数组名前不能加&
答案:正确
(12).C语言中,结构类型与结构变量的含义不一样,但都可以用来存放数据。
答案:错误
(13).C语言中,关键字enum可用于结构类型的定义
答案:错误
解析:枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。
(14).C语言中,结构类型与结构变量的含义一样,都可以用来存放数据。
答案:错误
三、编程题
(1).字符个数
描述
给定若干行字符串,要求统计大写字母、小写字母和数学字符的个数。
输入
标准输入,包括若干行,第一行为用例的个数n,接下来的n行,每行为一个字符串,可以包括空格、标点、数字字符和大小写字符,每行不超过80个字符。
输出
标准输出,每个用例用一行输出大写字符,小写字符和数字字符的个数,用一个空格隔开。
样例输入
2
Kdf7d sdfs9,./dfs
12dfABc3D,{}de
样例输出
1 10 2
3 5 3

int count1=0,count2=0,count3=0,i,t,n,j;
 char s[100];
 scanf("%d",&n);
 getchar();
 for(j=0;j<n;j++)
 {
  gets(s);
  t=strlen(s);
  for(i=0;i<t;i++)
 {
  if(s[i]>='A'&&s[i]<='Z')
   count1++;
  else if(s[i]>='a'&&s[i]<='z')
   count2++;
  else if(s[i]>='0'&&s[i]<='9')
   count3++;
  else;
 }
 printf("%d %d %d\n",count1,count2,count3);
 count1=0,count2=0,count3=0;
 }

(2).程序,从终端输入一个字符,判断该字符是否是十六进制数字字符,如果是,则输出该数字字符对应的整数,否则以十进制形式输出该字符对应的ASCII码。
例:
输入字符:‘a’ //a是十六进制字符;
输出结果: 10 //打印输出对应的十六进制整数10。
输入字符:‘g’ //g不是进制字符;
输出结果: 103 //g对应的ASCII值为103。

char c;
scanf("%c",&c);
if((c>='0' && c<='9') || (c>='a'&&c<='f') || (c>='A'&&c<='F')){if(c>='0' && c<='9')   
printf("%d",c-'0');if(c>='a' && c<='f')   
printf("%d",c-'a'+10);if(c>='A' && c<='F')   
printf("%d",c-'A'+10);}
else
printf("%d",c);
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值