c语言错题

这篇博客主要解析了C语言中的多个编程题目,涉及指针、结构体、内存分配、数组、输入输出等多个方面。解释了如何正确使用指针指向整型数据,指针变量与地址的关系,结构体变量作为函数参数时的传递方式,以及结构体变量成员的引用规则等。还讨论了C语言中结构体、指针、数组、字符串、用户标识符等相关知识点,包含了一些常见错误和陷阱的分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.若要用下面的程序片段使指针变量p指向一个存储整型数据的动态存储单元,则应填入(   D )。
int *p;
p=           malloc(sizeof(int));
A: int
B: int *
C: (* int) 
D: (int *)

解析:要使指针变量指向一个储存整型数据,可以使用强制转换,使类型一致,强制转换的格式为: (数据类型*)

tips:无论想要指针变量指向什么数据类型,都可以使用强制转换使类型一致。

2.若有说明:long *p, a; 则不能通过scanf语句正确给输入项读入数据的程序段是(    A  )。
A: *p=&a; scanf(“%ld”,p);
B: p=(long *)malloc(8); scanf(“%ld”,p);
C: scanf(“%ld”,p=&a);
D: scanf(“%ld”,&a);

解析:*p应该指向的是一个变量,而&a是一个变量的地址,p=&a是正确的。

 

3.以下选项中,能定义s为合法的结构体变量的是(    B )。

A) typedef  struct  abc 
   {double a;        
    char b[10];      
   }s;              

B) struct
    {double  a;
     char b[10];
    }s;

C) struct  ABC 
   {double  a;
    char  b[10];
   }           
   ABC  s;   

  D) typedef  ABC
     { double  a;
       char  b[10];
     }
     ABC  s;

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

解析:选项B的定义方式为直接定义结构体类型变量。

tips:定义一个结构体类型的变量,可采用3种方法:①先定义结构体类型再定义变量;②在定义类型的同时定义变量;③直接定义结构体类型变量,即不出现结构体名。

4. 结构体变量作参数时是地址传递。错误

解析:结构体指针作为函数参数时,调用时传递的是指向一个结构体变量的指针(即结构体变量的地址);结构体变量作为函数参数时,调用时传递的结构体变量本身。

5.c语言中,结构类型和结构变量定义一样,都可以用来存放数据。错误

6.若有以下说明和语句:
struct Student
{
 int num;
 int age;
}stu,*p;
p=&stu;
则可以用*p.age引用stu中成员age 错误

9.设有数组定义: char array[ ]="China"; 则数组array所占的空间为( c    )。

A: 4个字节
B: 5个字节
C: 6个字节
D: 7个字节

应该用p->age来表示stu中成员age

tips:普通结构体变量成员的引用:a.age

指针结构体变量成员的引用:p->age

 7.结构体和共用体成员的应用都可能引用最低一级的成员。正确

tips:对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。
既可引用结构变量成员的地址,也可引用结构变量的地址。

 8.可以把结构体数组元素作为一个整体输出。错误

9.设有数组定义: char array[ ]="China"; 则数组array所占的空间为(   C  )。

A: 4个字节
B: 5个字节
C: 6个字节
D: 7个字节 

解析:字符串在内存的存放方式是:除了有效的字符之外,还要在字符串的末尾保存一个特殊的字符'\0'来作为字符串的结尾。

10. 若有说明语句
char a[]="It is mine";      char *p=" It is mine";
则以下不正确的叙述是______D_____。

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

解析:a+1表示的是a[1],即字符t;a没有定义大小,可以存放很多个字符。

11.下面四个选项中,均是不合法的用户标识符的选项是(     C  )。

A: A P_0 do 
B:  float la0 _A
C: b-a goto int
D: _123 temp int

 

解析:用户标识符只能由字母,数字,下划线三种字符组成,第一个字符必须为字母或下划线。并且不能使用c语言的关键字作为标识符。选项C) 中goto和int是关键字,b-a中的"-"不是组成标识符的三种字符之一,所以,均是不合法用户标识符的选项是C) 。

12.若k是int型变量,且有下面的程序片段:
k= -3;
if(k<=0)  printf(“####”)
else  printf(“&&&&”)
上面程序片段的输出结果是(   D  )。

A: ####
B: &&&&
C: ####&&&&
D: 有语法错误,无输出结果

解析:printf后没有跟分号,出现语法错误。

tips:注意语句后必须跟一个分号。

13. 能正确表示a和b同时为正或同时为负的表达式是(   D )。

 

A: (a>=0||b>=0)&&(a<0||b<0) 
B: (a>=0&&b>=0)&&(a<0&&b<0)
C: (a+b>0)&&(a+b<=0)
D: a*b>0

解析:b选项表示的是a,b=0;a,c选项表示的是空;

tips:||表示或,&&表示并;

14.若有以下定义,则赋值正确的是(  C  )。
int a ,b , *p;
float c, *q;

A: p=&c
B: q=p
C: p=NULL
D: q=new int

解析:p = &c ;意思:取c的地址给p,类型不对。p要的是指向int型的变量的地址,但这里却给了个float型的。

q = p;:用p给q赋值。类型不对。p是指向int的指针,q却是指向float的指针,类型不同不能赋值。除非强制转换。

p = NULL; :p是一个指针,但它不指向任何变量,多以答案对的。也就是暂时先不给它赋值,以后再赋值。

q = new : 语法错误。new是关键字。

15.阅读以下程序:(int型占四个字节)
 main()
 {int a[10]={2,4,6,8,10,12,14,16,18,20},*p;
 p=a;
 printf("%x\n",p);
 printf("%x\n",p+9);
 }
 若第一个printf语句输出的是ffca,则第二个printf语句的输出是_____C__。

A: ffdd
B: ffdc
C: ffee
D: ffcd

解析:第一个输出的是ffca化为十进制为65482,p+9为18,一个整数占2个字节,即36,

65482+36=65518,化为十六进制为ffee

16.设变量n为float型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是(B)

A: n=(n*100+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

解析:float/int型时,int型转化为float型,n是浮点数,乘100+0.5后,若原先小数第三位>=5,则+0.5后就向前进位了;否则不进位,赋给整型m后,小数部分丢弃,达到了四舍五入的目的;再除以100是恢复原数的大小选项A能四舍五入,但不能保留2位小数;选项C操作的不是小数后第三位而是第五位了;选项D操作的不是小数后而是操作到小数点前面去了

17.p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是(B )

A: c=*p1+*p2
B: p2=c
C: p1=p2
D: c=*p1*(*p2)

解析:p1 和p2 定义的是指针变量 c为字符变量
A项 *(取内容符) 将p1 p2指向的变量的值的和赋给c是可以的。
B项 c是字符变量 p2是指针变量 ,指针变量只能付地址 改为p2=&c。
C项 指针就是地址p1 和p2是可以相互赋值的。
D项 是取其内容运算不是指针运算,是对的,

18.在C语言中,用于实现打开文件的库函数是(  C )。

A: fopens()
B: fclose()
C: fopen() 
D: fseek()

解析:fopens和floces是错误的写法

fopen函数是在当前目录下打开一个文件,其调用的一般形式为:

文件指针名=fopen(文件名,使用文件方式);

可以把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区。

与 FILE *fp = fopen("", "");相对应。

返回值:如果流成功关闭,fclose 返回 0,否则返回EOF(-1).

tips:文件写入函数:fwrite

fwrite() 是 C 语言标准库中的一个文件处理函数,功能是向指定的文件中写入若干数据块,如成功执行则返回实际写入的数据块数目。该函数以二进制形式对文件进行操作,不局限于文本文件。

文件读取函数:fread

函数原型: fread(void *buffer,size_t size,size_t count,FILE *stream);

返回值:读取的元素的个数

1."r" = "rt"
打开一个文本文件,文件必须存在,只允许读

2."r+" = "rt+"
打开一个文本文件,文件必须存在,允许读写

3."rb"
打开一个二进制文件,文件必须存在,只允许读

4.“rb+”
打开一个二进制文件,文件必须存在,允许读写

5."w" = “wt”
新建一个文本文件,已存在的文件将被删除,只允许写

6."w+" = "wt+"
新建一个文本文件,已存在的文件将被删除,允许读写

7.“wb”
新建一个二进制文件,已存在的文件将被删除,只允许写

8.“wb+”
新建一个二进制文件,已存在的文件将被删除,允许读写

9."a" = "at"
打开或新建一个文本文件,只允许在文件末尾追写

10."a+" = "at+"
打开或新建一个文本文件,可以读,但只允许在文件末尾追写

11.“ab”
打开或新建一个二进制文件,只允许在文件末尾追写

12.“ab+”
打开或新建一个二进制文件,可以读,但只允许在文件末尾追写

文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read): 只读
w(write): 只写
a(append): 追加
t(text): 文本文件,可省略不写
b(binary): 二进制文件

19. 若有说明语句:char c='\72';则变量c(  A    )。

A: 包含1个字符
B: 包含2个字符
C: 包含3个字符 
D: 说明不合法,c的值不确定

解析:char只有一个字符的内存空间,所以为一个字符。

20.若变量已正确定义并赋值,下面符合C语言语法的表达式是(     B)。

A: a:=b+1
B: a=b=c+2 
C: int 18.5%3
D: a=a+7=c+b

21对于下述语句,若将10赋给变量k1和k2,则应按和方式输入数据()
int k1,k2;
 scanf("%d%d",&k1,&k2);
A: 10 10
B: 1010
C: 10,10
D: 10;10

解析:输入时无论%d之间有没有空格,都应该空格输入,因为如果不空格,系统会认为只输入了一个数。

tips:如果是输出,%d之间有空格,就会输出有空格的。

22. 有结构体如下:
struct stu
{
 double nu;
 char name[30];
}stag;
结构体变量stag所占用的内存为多少:A

A: 40
B: 30
C: 38
D: 48

解析:double占8个字节,char占30 个,但是内存应该为最大字节的倍数,即8的倍数,所以应该为40

 tips:占用的内存应该算最大字节的倍数。

23.下面四个选项中,均是合法转义字符的选项是( B)。

A:  '\'' '\\' '\n'
B: '\' '\017' '\"'
C: '\018' '\f' 'xab'
D:  '\\0' '\101' 'xlf'

解析:A 很明显'\',这个不对
C '\018',8进制数里没有计数符8  'xab' 
D '\\0' 'x1f' 这两个都不对

24.已有如下定义和输入语句,若要求a1,a2的值分别为10,20,正确的输入方式是()
int a1,a2;
scanf("%d%d",&a1,&a2);
 

A: 10 20
B: 1020
C: 10,20
D: 10;20

解析:输入时无论%d之间有没有空格,都应该空格输入,因为如果不空格,系统会认为只输入了一个数

25.C语言的基本组成单位是语句   错误

解析:c语言的基本组成单位是函数。

26.存放地址的变量同其他变量一样,可以存放任何类型的数据。 错误

解析:存放地址的变量,只能用来存放地址量

27.定义结构体typedef  struct  one { int a;}s;      s a;则a为结构体变量。正确

28.若变量已正确说明为float类型,要通过语句scanf("%f %f %f ",&a,&b,&c); 给a赋于10.0,b赋予22.0,c赋予33.0,不正确的输入形式是(  B )。   
 

A: 10<回车>22<回车>33<回车> 
B: 10.0,22.0,33.0<回车>
C: 10.0<回车>22.0 33.0<回车> 
D: 10 22<回车>33<回车>

29.设int x,a,b;则下面if语句中错误的是(  B  )

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

30.在C语言中,数字029是一个(D)

A: 八进制数
B: 十六进制数
C: 十进制数
D: 非法数

31.当定义一个结构体变量时系统分配给它的内存是:___B___

A: 各成员所需内存量的总和
B: 成员中占内存量最大者所需的容量的倍数
C: 结构中第一个成员所需内存量
D: 结构中最后一个成员所需内存量

解析:占用的内存应该算最大字节的倍数

32。&b指的是变量b的地址处所存放的值。错误

&b指的是取b的地址。

33.定义数组时可以同时给数组赋初值,初值的个数可以超过数组的长度,多余的被忽略。 错误

35.C语言通过文件指针对它所指向的文件进行操作。正确

36.若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。正确

37.共用体所有成员共用的内存单元的大小为各成员需要占用内存大小之和。错误

解析:为最大字节的倍数。

38.当以参数w打开文件时,若指定路径下已有同名文件,则覆盖原有文件。正确

39.设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)

解析:||表示或,&&表示并。

40.用以下程序把大写字母A~Z转换成对应的小写字母a ~ z,其他字符不转换。
main()
{char  ch;
 scanf (  ________________);
 ch=(  __________________ )?ch+32:ch;
 printf(“char=%c\n”,   ch         );
}

解析:第一个应先输入字符ch 即:“%c,&ch”

第二个为转换大写,用条件语句,即:ch>='A'&&ch<='Z'

41.
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值