您好,欢迎访问三七文档
第1页共38页第一题:写一个函数fn(),功能是传一个参数是字符串,查找里面有没有相同的字符,有的话返回1,否则0.两种方法,一是效率最高的,二是最节省内存的.代码:intfn0(constchar*str){charnum[256]={0};unsignedchar*pos=(unsignedchar*)str;while(*pos!=0&&num[*pos]==0){num[*pos++]=1;}return*pos==0?0:1;}intfn1(constchar*str){constchar*p1,*p2;if(*str==0)return0;for(p1=str;*p1!=0;p1++){for(p2=p1+1;*p2!=0;p2++){if(*p1==*p2)return1;}}return0;}第二题:编写一个函数subs(char*str)打印出str的所有子串(例如1234的子串包括:1,2,3,4,12,13,14,23,24,34,123,234,1234)不能使用系统提供的有关字符处理的类库,库函数。/*writedbykf701kf_701@21cn.com;*/#includestdio.h;voidsubs(char*str){unsignedlonglen=0;inti,j,k;char*ptr1,*ptr2;for(ptr1=str;*ptr1!=0;++ptr1)++len;for(i=1;i=len;++i){ptr1=str;for(j=i;(len-(ptr1-str));=j;++ptr1){k=j;ptr2=ptr1;while(k--;0){第2页共38页putchar(*ptr2);++ptr2;}printf(\n);}}}intmain(intargc,char**argv){subs(argv[1]);exit(0);}第三题:chara[]=abc;charb[]={'a','b','c'};数组a和数组b的长度那个大?#includestdlib.h#includestdio.hintmain(intargc,char*argv[]){chara[]=abc;charb[]={'a','b','c'};printf(sa=%d,sb=%d\n,strlen(a),strlen(b));printf(ssa=%d,ssb=%d\n,sizeof(a),sizeof(b));return0;}第四题:面试经常遇到考const的问题,今天总结如下:#includestdio.husingnamespacestd;intmain(){constchar*pa;charconst*pb;charca='a';charcb='b';char*constpc=&ca;constchar*constpd=&cb;pa=&ca;pa=&cb;pb=&ca;pb=&cb;*pc='d';printf(ca=%c\n,ca);return0;}经过以上测试constchar*pa;charconst*pb;第3页共38页上面两种定义方法一样都是pa(pb)指向的变量的值不可改变,及*pa,*pb,而pa,和pb本身是可变的,如:pa=&ca;//ok×pa='c'//errorchar*constpc=&ca;pc本身是不可变的(只能在定义时初始化),但指向的变量值是可变的,如pc=&ca;//error*pc='d';//okconstchar*constpd=&cb;pd本身是不可变的,且指向的变量也是不可变的(只能在定义时初始化)pd=&cb;//error*pd='c';/error通过以上总结,无论怎样定义p都是一指针如果const在*左边,表示该指针指向的变量是不可变的如果const在*右边,表示该指针本身是不可变得第4页共38页第一部分:1、intk=0;while(k=1){k++;}A:循环一次B:循环无数次okC:语法错误D:不循环2、char*a=Hello;char*b=Hello;if(a==b)coutdklajklelsecoutakjgouo问输出??3、class_Student{public:floata;charb;}_Studentstudent;student.a=3.5;student.b=A;string问错误???答案:4、inti,a[5],*p=a;for(i=0;i5;i++){p++;*p=i;}问错误???答案:第二部分:HereisaprograminANSIStandardC:doublesum,a[20];inti;/**Somecodetoinitializearrayawithlegitimate*floatingpointvalueswhosesumislessthanmaximumdouble.*/sum=0.0;for(i=0;i20;i++)sum+=a[i];第5页共38页printf(%e,sum);sum=0.0;i=20;while(i--)sum+=a[i];printf(%e,sum);Question:Willthe2printedvalues:[相约加拿大:枫下论坛rolia.net/forum]1)alwaysbethesame?ifso,explainwhy.2)alwaysbedifferent?ifso,explainwhy.3)sometimesbethesameandsometimesdifferent?ifso,giveanexample.Pleasebeascompleteaspossible.第三部分:1.改错(5分)voidtest(){charstr[10];char*str1=0123456789;strcpy(str,str1);}2.改错(5分)voidtest(){charstr[10],str1[10];for(int=0;i10;i++){str[i]='a';}strcpy(str,str1);}3.读程序,写出结果(5分)intsum(inta){intc=0;staticintb=3;c+=1;b+=2;return(a+b+c)}intmain()第6页共38页{inta=2;for(inti=0;i5;i++){printf(%d,,sum(a));}return0;}4.读程序,写出结果(5分)intmain(){inta[3];a[0]=0;a[1]=1;a[2]=2;int*p,*q;p=a;q=&a[2];intc=a[q-p];printf(valuec=%d\n,c++);printf(valuec=%d\n,c);return0;}5.读程序,写出结果(10分,选做)#defineSTRCPY(a,b)strcpy(a##_p,#b)intmain(){charvar1_p[20];charvar2_p[30];strcpy(var1_p,aaaa);strcpy(var2_p,bbbb);STRCPY(var1,var2);STRCPY(var2,var1);printf(var1=%s\n,var1_p);printf(var2=%s\n,var2_p);return0;}6.(10分)不用除法(即不能使用/号)和库函数,计算285/16的商和余数,要求效率尽量高.7.(15分)编写字符串反转函数:strrev.要求时间和空间效率都尽量高.(测试用例:输入abcd,输出应为dcba)函数原型为:第7页共38页char*strrev(char*dest,char*src);提示:dest和src可能是同一个字符串.8.(15分)编写将字符串转换成整数的函数atoi,只处理输入字符串仅由0-9,'-','+',和空格的情况.函数原型为:intatoi(char*str);提示:如果字符串不能构成一整数,可以直接返回0.但是对于以空格开始的字符串应特殊处理.9.(30分)编写一组单链表操作函数.链表的结构如下:structListNode{longid;structListNode*next;};链表节点以id的从小到大排列,当id相等时,节点顺序没有约定,谁在前都可以.要求编写的函数有:遍历函数:返回cur下一个节点,如果没有更多的节点,返回0;structListNode*ListNext(structListNode*cur);插入函数:将newNode插入到head链表中,然后返回newNode的前一节点,如果newNode已经在链表中,返回0.structListNode*ListInsert(structListNode*head,structListNode*newNode);删除函数:从head中删除theNode节点.返回theNode的前一节点.如果theNode不在链表中,返回0;structListNode*ListRemove(structListNode*head,structListNode*theNode);附加:1、如何fork出4个进程2、实现snprintf第8页共38页1.是不是一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?virtual修饰符会被隐形继承的。private也被集成,只事派生类没有访问权限而已virtual可加可不加子类的空间里有父类的所有变量(static除外)同一个函数只存在一个实体(inline除外)子类覆盖它的函数不加virtual,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。2.输入一个字符串,将其逆序后输出。(使用C++,不建议用伪码)#includeiostreamusingnamespacestd;voidmain(){chara[50];memset(a,0,sizeof(a));inti=0,j;chart;cin.getline(a,50,'\n');for(i=0,j=strlen(a)-1;istrlen(a)/2;i++,j--){t=a[i];a[i]=a[j];a[j]=t;}coutaendl;}//第二种stringstr;cinstr;str.replace;coutstr;--------------------------------------------------------------------------3.请简单描述Windows内存管理的方法。内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧~~我先说个大概,希望能够抛砖引玉吧当程序运行时需要从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,第9页共38页平均浪费了50%的内存空间,但时易于管理。页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。段页式管理:结合了段
本文标题:c语言面试题
链接地址:https://www.777doc.com/doc-3818365 .html