纯C程序题Word格式文档下载.docx

上传人:b****4 文档编号:17854644 上传时间:2022-12-11 格式:DOCX 页数:63 大小:41.02KB
下载 相关 举报
纯C程序题Word格式文档下载.docx_第1页
第1页 / 共63页
纯C程序题Word格式文档下载.docx_第2页
第2页 / 共63页
纯C程序题Word格式文档下载.docx_第3页
第3页 / 共63页
纯C程序题Word格式文档下载.docx_第4页
第4页 / 共63页
纯C程序题Word格式文档下载.docx_第5页
第5页 / 共63页
点击查看更多>>
下载资源
资源描述

纯C程序题Word格式文档下载.docx

《纯C程序题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《纯C程序题Word格式文档下载.docx(63页珍藏版)》请在冰豆网上搜索。

纯C程序题Word格式文档下载.docx

___52____

DATE是一个union,变量公用空间.里面最大的变量类型是int[5],占用20个字节.所以它的大小是20

data是一个struct,每个变量分开占用空间.依次为int4+DATE20+double8=32.

所以结果是20+32=52.

当然...在某些16位编辑器下,int可能是2字节,那么结果是int2+DATE10+double8=20

5、写出下列代码的输出内容

intinc(inta)

return(++a);

intmulti(int*a,int*b,int*c)

return(*c=*a**b);

typedefint(FUNC1)(intin);

typedefint(FUNC2)(int*,int*,int*);

voidshow(FUNC2fun,intarg1,int*arg2)

INCp=&

inc;

inttemp=p(arg1);

fun(&

temp,&

arg1,arg2);

%d\n"

*arg2);

inta;

show(multi,10,&

a);

110

7、请找出下面代码中的所以错误

说明:

以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”

1、#include"

string.h"

2、main()

3、{

4、char*src="

hello,world"

;

5、char*dest=NULL;

6、intlen=strlen(src);

7、dest=(char*)malloc(len);

8、char*d=dest;

9、char*s=src[len];

10、while(len--!

=0)

11、d++=s--;

12、printf("

%s"

dest);

13、return0;

14、}

方法1:

intmain(){

char*src="

intlen=strlen(src);

char*dest=(char*)malloc(len+1);

//要为\0分配一个空间

char*d=dest;

char*s=&

src[len-1];

//指向最后一个字符

while(len--!

=0)

*d++=*s--;

*d=0;

//尾部要加\0

%s\n"

free(dest);

//使用完,应当释放空间,以免造成内存汇泄露

方法2:

#include<

string.h>

charstr[]="

intlen=strlen(str);

chart;

for(inti=0;

i<

len/2;

i++)

t=str[i];

str[i]=str[len-i-1];

str[len-i-1]=t;

str);

1.-1,2,7,28,,126请问28和126中间那个数是什么?

为什么?

第一题的答案应该是4^3-1=63

规律是n^3-1(当n为偶数0,2,4)

n^3+1(当n为奇数1,3,5)

答案:

63

2.用两个栈实现一个队列的功能?

要求给出算法和思路!

设2个栈为A,B,一开始均为空.

入队:

将新元素push入栈A;

出队:

(1)判断栈B是否为空;

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

(3)将栈B的栈顶元素pop出;

这样实现的队列入队和出队的平摊复杂度都还是O

(1),比上面的几种方法要好。

3.在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?

函数名:

atol

功能:

把字符串转换成长整型数

用法:

longatol(constchar*nptr);

程序例:

stdlib.h>

intmain(void)

longl;

char*str="

98765432"

l=atol(lstr);

string=%sinteger=%ld\n"

str,l);

return(0);

8.enumstring

x1,

x2,

x3=10,

x4,

x5,

}x;

问x=0x801005,0x8010f4;

9.unsignedchar*p1;

unsignedlong*p2;

p1=(unsignedchar*)0x801000;

p2=(unsignedlong*)0x810000;

请问p1+5=;

p2+5=;

4.unsignedshorthash(unsignedshortkey)

return(key>

>

)%256

请问hash(16),hash(256)的值分别是:

A.1.16;

B.8.32;

C.4.16;

D.1.32

四.找错题:

1.请问下面程序有什么错误?

inta[60][250][1000],i,j,k;

for(k=0;

k<

=1000;

k++)

for(j=0;

j<

250;

j++)

for(i=0;

i<

60;

i++)

a[i][j][k]=0;

把循环语句内外换一下

2.#defineMax_CB500

voidLmiQueryCSmd(StructMSgCB*pmsg)

unsignedcharucCmdNum;

......

for(ucCmdNum=0;

ucCmdNum<

Max_CB;

ucCmdNum++)

......;

死循环

3.以下是求一个数的平方的程序,请找出错误:

#defineSQUARE(a)((a)*(a))

inta=5;

intb;

b=SQUARE(a++);

4.typedefunsignedcharBYTE

intexamply_fun(BYTEgt_len;

BYTE*gt_code)

BYTE*gt_buf;

gt_buf=(BYTE*)MALLOC(Max_GT_Length);

if(gt_len>

Max_GT_Length)

returnGT_Length_ERROR;

.......

1.用宏定义写出swap(x,y)

#defineswap(x,y)\

x=x+y;

\

y=x-y;

x=x-y;

2.数组a[N],存放了1至N-1个数,其中某个数重复一次。

写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:

intdo_dup(inta[],intN)

3一语句实现x是否为2的若干次幂的判断

inti=512;

cout<

<

boolalpha<

((i&

(i-1))?

false:

true)<

endl;

4.unsignedintintvert(unsignedintx,intp,intn)实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.如x=0b00010001,p=4,n=3转换后x=0b01100001

unsignedintintvert(unsignedintx,intp,intn){

unsignedint_t=0;

unsignedint_a=1;

for(inti=0;

i<

n;

++i){

_t|=_a;

_a=_a<

1;

_t=_t<

p;

x^=_t;

returnx;

慧通:

什么是预编译

何时需要预编译:

1、总是使用不经常改动的大型代码体。

2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。

在这种情况下,可以将所有包含文件预编译为一个预编译头。

char*constp;

charconst*p

constchar*p

上述三个有什么区别?

//常量指针,p的值不可以修改

charconst*p;

//指向常量的指针,指向的常量值不可以改

constchar*p;

//和charconst*p

charstr1[]="

abc"

charstr2[]="

constcharstr3[]="

constcharstr4[]="

constchar*str5="

constchar*str6="

char*str7="

char*str8="

 

(str1==str2)<

(str3==str4)<

(str5==str6)<

(str7==str8)<

结果是:

0011

解答:

str1,str2,str3,str4是数组变量,它们有各自的内存空间;

而str5,str6,str7,str8是指针,它们指向相同的常量区域。

12.以下代码中的两个sizeof用法有问题吗?

[C易]

voidUpperCase(charstr[])//将str中的小写字母转换成大写字母

for(size_ti=0;

sizeof(str)/sizeof(str[0]);

++i)

if('

a'

=str[i]&

str[i]<

='

z'

str[i]-=('

-'

A'

);

charstr[]="

aBcDe"

"

str字符长度为:

<

sizeof(str)/sizeof(str[0])<

UpperCase(str);

str<

函数内的sizeof有问题。

根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。

函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。

一个32位的机器,该机器的指针是多少位

指针是多少位只要看地址总线的位数就行了。

80386以后的机子都是32的数据总线。

所以指针的位数就是4个字节了。

inta[5]={1,2,3,4,5};

int*ptr=(int*)(&

a+1);

%d,%d"

*(a+1),*(ptr-1));

输出:

2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5

a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)

则ptr实际是&

(a[5]),也就是a+5

原因如下:

a是数组指针,其类型为int(*)[5];

而指针加1要根据指针类型加上一定的值,

不同类型的指针+1之后增加的大小不同

a是长度为5的int数组指针,所以要加5*sizeof(int)

所以ptr实际是a[5]

但是prt与(&

a+1)类型是不一样的(这点很重要)

所以prt-1只会减去sizeof(int*)

a,&

a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&

a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&

a+1是下一个对象的地址,即a[5].

1.请问以下代码有什么问题:

intmain()

chara;

char*str=&

a;

strcpy(str,"

hello"

);

printf(str);

没有为str分配内存空间,将会发生异常

问题出在将一个字符串复制进一个字符变量指针所指地址。

虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

char*s="

AAA"

s);

s[0]='

B'

有什么错?

"

是字符串常量。

s是指针,指向这个字符串常量,所以声明s的时候就有问题。

cosntchar*s="

然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

1、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。

.#defineMin(X,Y)((X)>

(Y)?

(Y):

(X))//结尾没有;

2、嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。

while

(1){}或者for(;

3.c和c++中的struct有什么不同?

c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。

c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private

4.#include<

voidgetmemory(char*p)

p=(char*)malloc(100);

strcpy(p,"

helloworld"

intmain()

char*str=NULL;

getmemory(str);

%s/n"

free(str);

程序崩溃,getmemory中的malloc不能返回动态内存,free()对str操作很危险

5.charszstr[10];

strcpy(szstr,"

0123456789"

产生什么结果?

长度不一样,会造成非法的OS

1:

(void*)ptr和(*(void**))ptr的结果是否相同?

其中ptr为同一个指针

.(void*)ptr和(*(void**))ptr值是相同的

2:

intx=3;

x);

return1;

问函数既然不会被其它函数调用,为什么要返回1?

mian中,c标准认为0表示成功,非0表示错误。

具体的值是某中具体出错信息

1,要对绝对地址0x100000赋值,我们可以用

(unsignedint*)0x100000=1234;

那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?

*((void(*)())0x100000)();

首先要将0x100000强制转换成函数指针,即:

(void(*)())0x100000

然后再调用它:

*((void(*)())0x100000)();

用typedef可以看得更直观些:

typedefvoid(*)()voidFuncPtr;

*((voidFuncPtr)0x100000)();

2,已知一个数组table,用一个宏定义,求出数据的元素个数

#defineNTBL

#defineNTBL(sizeof(table)/sizeof(table[0]))

unsignedshortA=10;

~A=%u\n"

~A);

charc=128;

c=%d\n"

c);

输出多少?

并分析过程

第一题,~A=0xfffffff5,int值为-11,但输出的是uint。

所以输出4294967285

第二题,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128。

这两道题都是在考察二进制向int或uint转换时的最高位处理。

分析下面的程序:

voidGetMemory(char**p,intnum)

*p=(char*)malloc(num);

GetMemory(&

str,100);

if(str!

=NULL)

world"

\nstris%s"

getchar();

问输出结果是什么?

希望大家能说说原因,先谢谢了

输出strisworld。

free只是释放的str指向的内存空间,它本身的值还是存在的.

所以free之后,有一个好的习惯就是将str=NULL.

此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,

尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。

这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。

当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用内存的地址返回。

但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的,只不过。

楼上都说过了,最好别这么干。

chara[10],strlen(a)为什么等于15?

运行的结果

#include"

stdio.h"

voidmain()

charaa[10];

strlen(aa));

sizeof()和初不初始化,没有关系;

strlen()和初始化有关。

char(*str)[20];

/*str是一个数组指针,即指向数组的指针.*/

char*str[20];

/*str是一个指针数组,其元素为指针型数据.*/

longa=0x801010;

a+5=?

0x801010用二进制表示为:

“100000000001000000010000”,十进制的值为8392720,再加上5就是8392725罗

1)给定结构structA

chart:

4;

chark:

unsignedshorti:

8;

unsignedlongm;

};

问sizeof(A)=?

给定结构structA

4位

8位

//偏移2字节保证4字节对齐

//共8字节

2)下面的函数实现在一个数上加一个数,有什么错误?

请改正。

intadd_n(intn)

staticinti=100;

i+=n;

returni;

当你第二次调用时得不到正确的结果,难道你写个函数就是为了调用一次?

问题就出在static上?

//帮忙分析一下

iostream.h>

malloc.h>

memory.h>

typedefstructAA

intb1:

5;

intb2:

2;

}AA;

AAaa;

charcc[100];

strcpy(cc,"

0123456789abcdefghijklmnopqrstuvwxyz"

memcpy(&

aa,cc,sizeof(AA));

aa.b1<

endl;

aa.b2<

答案是-16和1

首先sizeof(AA)的大小为4,b1和b2分别占5bit和2bit.

经过strcpy和memcpy后,aa的4个字节所存放的值是:

0,1,2,3的ASC码,即00110000,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 思想汇报心得体会

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1