王牌71一、常见字符串1.写出在母串中查找子串出现次数的代码。intcount(char*str,char*substr){char*str1;char*str2;intnum=0;while(*str!='\0'){str1=str;str2=s;while(*str2==*str1&&(*str2!='\0')&&(*str1!='0')){str2++;str1++;}if(*str2=='\0')num++;str++;}returnnum;}2.查找第一个匹配子串位置,如果返回的是str1长度len1表示没有找到。size_tfind(char*str1,char*str2){size_ti=0;size_tlen1=strlen(str1)size_tlen2=strlen(str2);2if(len1-len20)returnlen1;for(;ilen1-len2;i++){size_tm=i;size_tj=0for(;size_tj=0;jlen2;j++){if(str1[m]!=str2[j])break;m++;}if(j==len)break;}returnilen1-len2?i:len1;}3.实现strcpy函数。char*strcpy(char*dst,constchar*src){assert(dst!=NULL&&src!=NULL);char*target=dst;while(*dst++=*src++);returntarget;}4.实现字符串翻转。voidreserve(char*str){assert(str!=NULL);char*p1=str;char*p2=str-1;while(*++p2);//一般要求不能使用strlenp2-=1;while(p1p2){王牌73charc=*p1;*p1++=*p2;*p2--=c;}}5.实现strcmp函数。intstrcmp11(char*src,char*dst){assert(src!=0&&r!=0);while(*src==*dst&&*src!='\0'){src++,dst++;}if(*src*dst)return1;elseif(*src==*dst)return0;return-1;}6.用指针的方法,将字符串“ABCD1234efgh”前后对调显示。//不要用strlen求字符串长度,这样就没分了charstr123[]=ABCD1234efgh;char*p1=str123;char*p2=str123-1;while(*++p2);p2-=1;while(p1p2){charc=*p1;*p1++=*p2;*p2--=c;}47.给定字符串A和B,输出A和B中的最大公共子串。比如A=aocdfeB=pmcdfa则输出cdf。#includestdio.h#includestdlib.h#includestring.hchar*commanstring(charshortstring[],charlongstring[]){inti,j;char*substring=malloc(256);if(strstr(longstring,shortstring)!=NULL)//如果……,那么返回returnshortstring;;for(i=strlen(shortstring)-1;i0;i--)//否则,开始循环计算{for(j=0;j=strlen(shortstring)-i;j++){memcpy(substring,&shortstring[j],i);substring[i]='\0';if(strstr(longstring,substring)!=NULL)returnsubstring;}}returnNULL;}intmain(){char*str1=malloc(256);char*str2=malloc(256);char*comman=NULL;gets(str1);gets(str2);if(strlen(str1)strlen(str2))//将短的字符串放前面comman=commanstring(str2,str1);elsecomman=commanstring(str1,str2);王牌75printf(thelongestcommanstringis:%s\n,comman);}8.判断一个字符串是不是回文。intIsReverseStr(char*str){inti,j;intfound=1;if(str==NULL)return-1;char*p=str-1;while(*++p!='\0');--p;while(*str==*p&&strp)str++,p--;if(strp)found=0;returnfound;}9.写函数完成内存的拷贝。void*memcpy(void*dst,constvoid*src,unsignedintlen){registerchar*d;registerchar*s;if(len==0)returndst;if(dstsrc)//考虑覆盖情况{d=(char*)dst+len-1;s=(char*)src+len-1;while(len=4)//循环展开,提高执行效率{*d--=*s--;*d--=*s--;*d--=*s--;6*d--=*s--;len-=4;}while(len--){*d--=*s--;}}elseif(dstsrc){d=(char*)dst;s=(char*)src;while(len=4){*d++=*s++;*d++=*s++;*d++=*s++;*d++=*s++;len-=4;}while(len--){*d++=*s++;}}returndst;}10.写一个函数,它的原形是intcontinumax(char*outputstr,char*intputstr)。功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:abcd12345ed125ss123456789的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789intcontinumax(char*outputstr,char*inputstr){char*in=inputstr,*out=outputstr,*temp,*final;intcount=0,maxlen=0;王牌77while(*in!='\0'){if(*in47&&*in58){for(temp=in;*in47&&*in58;in++)count++;}elsein++;if(maxlencount){maxlen=count;count=0;final=temp;}}for(inti=0;imaxlen;i++){*out=*final;out++;final++;}*out='\0';returnmaxlen;}二、常识题1.请说出static和const关键字的作用,至少说出两种。static关键字至少有下列5个作用:⑴函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;⑵在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数8访问;⑶在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;⑷在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;⑸在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。const关键字至少有下列5个作用:⑴欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;⑵对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;⑶在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;⑷对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;⑸对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:constclassAoperator*(constclassA&a1,constclassA&a2);operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:classAa,b,c;(a*b)=c;//对a*b的结果赋值操作(a*b)=c显然不符合编程者的初衷,也没有任//何意义2.如何判断是C还是C++编译器?#ifdefine_CPLUSPLUCcout”C++”;#elsecout”C””;3.如何避免重复包含一个头文件?#ifndef_HEADER_#define_HEADER_……#endif王牌794.在什么时候需要使用“常引用”?如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const类型标识符&引用名=目标变量名。5.引用与指针有什么区别?⑴引用必须被初始化,指针不必。⑵引用初始化以后不能被改变,指针可以改变所指的对象。⑶不存在指向空值的引用,但是存在指向空值的指针。⑷重载操作符使用引用可以完成串试操作。6.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在全局静态存储区,局部变量在堆栈。7.什么是平衡二叉树?左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。8.什么函数不能声明为虚函数?构造函数。9.冒泡排序算法和快速排序算法的时间复杂度分别是什么?冒泡排序:O(n^2)。快速排序o(nlgn)。10.进程间通信的方式有哪些?进程间通信的方式有:共享内存,管道,Socket,消息队列,DDE等。11.纯虚函数如何定义?使用时应注意什么?virtualvoidf()=0;纯虚函数是接口,子类必须要实现。1012.c和c++中的struct有什么不同?c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private。13.const符号常量:(1)constchar*p(2)charconst*p(3)char*constp说明上面三种描述的区别?如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。14.数组和链表的区别?数组:数据顺序存储,固定大小。连表:数据可以随机存储,大小可动态改变。15.线程与进程的区别和联系?线程是否具有相同的堆栈?dll是否有独立的堆栈?进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。DLL中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为DLL中的代码是被某些线程所执行,只有线程拥有堆栈,如果DLL中的代码是EXE中的线程所调用,那么这个时候是不是说这个DLL没有自己独立的堆栈?如果DLL中的代码是由DLL自己创建的线程所执行,那么是不是说DLL有独立的堆栈?以上讲的是堆栈,如果对于堆来说,每个DLL有自己的堆,所以如果是从DLL中动态分配的内存,最好是从DLL中删除,如果你从DLL中分配内存,然后在EXE中,或者另外一个DLL中删除,很有可能