1、 unionV structX unsignedchars1:s2:s3: x; unsignedc; v; v.c=100; printf(%d,v.x.s3); 结果:3。100的2进制是1100100,去掉后面5位余11放入x.s3中,所以结果是3。(4) 对于空的类进行评测。 class A ; sizeof(A) = 1; 默认空类是有一个占位符的。 对于虚函数,下面的代码中,sizeof(A)=4;sizeof(B) =4; 任何含有虚函数的类都拥有一个vptr指针,用来指向虚函数表vtable。sizeof(vptr) = 4。 class A virtual test(); c
2、lass B: public A; class Astatic int a; 对于静态成员变量是分配在全局存储区的,所以A还是相当于空类。 class C:public virtual A ; sizeof(C)=4; 对于虚拟继承的类拥有虚函数表,所以空类C含有vptr.(5) 设有以下说明和定义: typedef union long i; int k5; char c; DATE; / sizeof(int)*5 = 20 struct data int cat; DATE cow; double dog; too; /4+20+8 = 32 DATE max; 则语句 printf(,
3、sizeof(struct date)+sizeof(max);的执行结果是:52 对于union联合来说,取其中最大元素长度来做为联合大小。(6) 使用malloc或者new 分配内存,void *ppmalloc(10); sizeof(p) = 4; 跟指针一样,sizeof 只能测出静态数组的长度,无法检测动态分配的或外部数组大小(7) 下面函数输出结果:对于char str100或者char str参数都退化为char* str,这样的函数即使传入char s10 也是可以的 void Func(char str100) printf(%dn, sizeof(str); char s
4、10; /函数对数组长度并没有检验 Func(s);sizeof( char* ) = 4; 如何强制str为100位数组?可以如此声明 char ( &str )100; 理解顺序:第一、str声明为一个引用;第二、引用一个100元素数组;第三、数组元素每个为int大小。 void Func(char (&str)100) char s100;/这里必须给定100位长度char数组100*sizeof(char) = 100CONST 常见题目(1) const 与 #define有什么不同? 第一、 const 常量有数据类型,而宏没有数据类型。编译器可以对const 常量 进行类型检查,
5、而对宏只进行字符替换没有类型检查;第二、有些编译器可以对const常量进行调试,但不能对宏常量进行调试; 第三、const 可以用来修饰函数参数、函数返回值;在C+里还可以用来修饰函数,定义内中某个成员函数为常量函数。(2) 写一个标准宏MIN,这个宏输入两个参数并返回较小的一个 #define MIN(A,B) ( ( A ) val ) r = m; m = (m+l)/2; else if(am val) l = m; m = (m+r)/2; else return m; return -1; /没有找到2 常见字符串面试题写出在母串中查找子串出现次数的代码 /* 在母串中查找子串出现
6、次数的代码。*str:母字符串;*s:子字符串*/int count(char* str,char* s) char* s1; char* s2; int count = 0; while( *str != 0 ) s1 = str; s2 = s; while( ( *s2 = *s1 ) & ( *s2 ! ) & ( *s1 ! ) ) s2+; s1+; if( *s2 = count+; str+; return count;查找第一个匹配子串位置,如果返回的是s1长度len1表示没有找到。size_t find(char* s1,char* s2) size_t len1 = st
7、rlen(s1); size_t len2 = strlen(s2); if( len1 - len2 0 ) return len1; for( size_t i=0; ilen1-len2; i+ ) size_t m = i; for( size_t j=0; j len2; j+ ) if( s1m != s2j ) break; m+; if( j = len2 ) break; return ( i *strSec ) / 找到第一个不等的字符,strFir的靠后 return 1; else if( *strFir = *strSec) / 两个字符串相等 return 0; r
8、eturn -1; / 找到第一个不等的字符,strFir的靠前实现字符串翻转void myreverse(char* str) assert(str != NULL); char * p1 = str; char * p2 = str-1; while( *+p2 ) /一般要求不能使用strlen p2 -= 1; while(p1p2) char c = *p1; *p1+ = *p2; *p2- = c;用指针的方法,将字符串“ABCD1234efgh”前后对调显示/不能用strlen求字符串长度,否则就没分了 char strSrc = ABCD1234efgh char * p1
9、= strSrc; char * p2 = strSrc - 1; while( *+p2 ) NULL; p2 -= 1; while( p1 p2 ) char c = *p1; *p1+ = *p2; *p2- = c;给定字符串A和B,输出A和B中的最大公共子串。比如A=aocdfe B=pmcdfa 则输出cdf#include stdafx.h#include#include using namespace std;char *commanstring(char shortstring, char longstring) int i, j; char *substring = (c
10、har *)malloc(256); if( strstr( longstring, shortstring ) != NULL) /如果,那么返回shortstring return shortstring; for( i = strlen( shortstring ) - 1; i 0; i- ) /否则,开始循环计算 for( j=0;= strlen( shortstring ) - i; memcpy( substring, &shortstringj, i ); / memcpy:从&shortstringj里 / 拷贝i字节到substring里 substringi = if(
11、 strstr( longstring, substring ) != NULL ) return substring; return NULL;int main() char *str1 = (char *)malloc(256); char *str2 = (char *)malloc(256); char *comman = NULL; gets( str1 ); gets( str2 ); if( strlen( str1 ) strlen( str2 ) ) /将短的字符串放前面 comman = commanstring( str2, str1 ); else comman = c
12、ommanstring( str1, str2 ); printf(the longest comman string is: %sn, comman); return 0;判断一个字符串是不是回文int IsReverseStr(char *str) int found = 1; if( str = NULL ) return -1; / 空字串,返回-1 char* p = str - 1; while( *+p !) p -= 1; while( ( *str = *p ) & ( strp ) ) str+,p-; / 可以写while语句里:while( ( *str+ = *p-
13、) &p ) ) ; if( str src ) /考虑覆盖情况 d = (char *)dst + len - 1; s = (char *)src + len - 1; while ( len = 4 ) / 循环展开,提高执行效率 *d- = *s-; len -= 4; while ( len- ) else if ( dst 47 & *in 58 ; in+ ) count+; else in+; if( maxlen count ) maxlen = count; count = 0; final = temp; for(int i = 0; i 0 ( *p i ? cnt :
14、 i ); return cnt;编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。char * search(char *cpSource, char ch) char *cpTemp=NULL, *cpDest=NULL; int iTemp, iCount=0; while(*cpSource) if(*cpSource = ch ) iTemp = 0; cpTemp = cpSource; while(*cpSource = ch) +iTemp, +cpSource; if(iTemp iCount) iCount = iTemp, c
15、pDest = cpTemp; if(!*cpSource) break; +cpSource; return cpDest;3 排序算法写出快速排序或者某种排序算法代码(1) 快速排序int partition(int* a,int l,int r) int i=l-1,j=r,v=ar; while(1) while(a+iv) if(j=j) swap(ai,aj); swap(ai,ar); return i;void qsort(int* a,int l,int r) if(rl) int i = partition(a,l,r); qsort(a,l,i-1); qsort(a,i+1,r);有兴趣可以看看下面2个。一般面试不会要求的改进1: while(lr) /防止过多递归 l = i+1;改进2: if(r-l32) /防止分割恶化 insertsort(a+l,r-l+1); /后面的插入排序 return; int i = partition(a,l
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1