C++笔试题库之编程、问答题 100~150道(五)

2014-11-24 00:54:37 · 作者: · 浏览: 55
]!=front_node) {


printf(“%d\n”,a[current_node]);


R[front_node]=R[current_node];


if(K==1) {


current_node=R[front_node];


continue;


}


for(int i=0;i

front_node=R[front_node];


}


current_node=R[front_node];


}


index=front_node;


values=a[front_node];


return 0;


}


int main(void) {


int a[MAXLINE],R[MAXLINE],suffix,index,values,start,i,K;


suffix=index=values=start=0;


K=2;


for(i=0;i

a[i]=i;


R[i]=i+1;


}


R[i-1]=0;


find_n(a,R,K,index,values,2);


printf(“the value is %d,%d\n”,index,values);


return 0;


}


144、指出下列程序有什么错误:


void test2()


{


char string[10], str1[10];


int i;


for(i=0; i<10; i++)


{


str1[i] = ‘a’;


}


strcpy( string, str1 );


}


解答:对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;


str1不能在数组内结束:因为str1的存储为:{a,a,a,a,a,a,a,a,a,a},没有’\0′(字符串结束符),所以不能结束


strcpy( char *s1,char *s2)他的工作原理是,扫描s2指向的内存,逐个字符付到s1所指向的内存,直到碰到’\0′,因为str1结尾没有’\0′,所以具有不确定性,不知道他后面还会付什么东东。


正确应如下


void test2()


{


char string[10], str1[10];


int i;


for(i=0; i<9; i++)


{


str1[i] = ‘a’+i; //把abcdefghi赋值给字符数组


}


str[i]=’\0′;//加上结束符


strcpy( string, str1 );


}


145、实现strcmp


int StrCmp(const char *str1, const char *str2)


{


assert(str1 && srt2);


while(*str1 && *str1++ = = *str2++);


return *str1-*str2;


}


146.符串A和B,输出A和B中的最大公共子串。


比如A=”aocdfe” B=”pmcdfa” 则输出”cdf”


*/


//Author: azhen


#i nclude


#i nclude


#i nclude


char *commanstring(char shortstring[], char longstring[])


{


int i, j;


char *substring=malloc(256);


if(strstr(longstring, shortstring)!=NULL) //如果……,那么返回shortstring


return shortstring;


for(i=strlen(shortstring)-1;i>0; i–) //否则,开始循环计算


{


for(j=0; j<=strlen(shortstring)-i; j++){


memcpy(substring, &shortstring[j], i);


substring[i]=’\0′;


if(strstr(longstring, substring)!=NULL)


return substring;


}


}


return NULL;


}



main()


{


char *str1=malloc(256);


char *str2=malloc(256);


char *comman=NULL;


gets(str1);


gets(str2);


if(strlen(str1)>strlen(str2)) //将短的字符串放前面


comman=commanstring(str2, str1);


else


comman=commanstring(str1, str2);


printf(“the longest comman string is: %s\n”, comman);


}



147、写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于


str2返回1,若str1小于str2返回-1


int strcmp ( const char * src,const char * dst)


{


int ret = 0 ;


while( ! (ret = *(unsigned char *)src – *(unsigned char *)dst) && *dst)


{


++src;


++dst;


}


if ( ret < 0 )


ret = -1 ;


else if ( ret > 0 )


ret = 1 ;


return( ret );


}


148、判断一个字符串是不是回文


int IsReverseStr(char *aStr)


{


int i,j;


int found=1;


if(aStr==NULL)


return -1;


j=strlen(aStr);


for(i=0;i

if(*(aStr+i)!=*(aStr+j-i-1))


{


found=0;


break;


}


return found;



149 #include main()


{


int c[3][3]={1,2,3,4,5,6,7,8,9};


for(int i=0;i<3;i++)


for(int j=0;j<3;j++)


printf(“%ld\n”,&c[j]);


printf(“————————-\n”);


printf(“%ld\n”,(c+1));


printf(“%ld\n”,(*c+1));


printf(“%ld\n”,&c[0][0]);


printf(“%ld\n”,**c);


printf(“%ld\n”,*c[0]);


if(int(c)==int(*c)) printf(“equl”);


}


为什么c,*c的值相等,(c+1),(*c+1)的值不等 c,*c,**c,代表什么意思?


参考答案:


c是第一个元素的地址,*c是第一行元素的首地址,其实第一行元素的地址就是第一个元素的地址,这容易理解。**c是提领第一个元素。


为什么c,*c的值相等?


int c因为直接用c表示数组c[0][0] printf(“%ld\n”,*c[0]);语句已将指针移到数组头。 int(*c)表示c0的值为1,所以相等。 数组c的存放空间示意如下:(机器中是行优先存放的) c[0][0] c[0][1] c[0][2] c[1][0] c[1][1] c[1][2] c[2][0] c[2][1] c[2][2] c是一个二维数组名,实际上它是一个指针常量,不能进行自加、自减运算,即:c++、c–、++c、–c 都是不允许的;


c: 数组名;是一个二维指针,它的值就是数组的首地址,也即第一行元素的首地址(等于 *c),也 等于第一行第一个元素的地址( & c[0][0]);可以说成是二维数组的行指针。 *c: 第一行元素的首地址;是一个一维指针,可以说成是二维数组的列指针。 **c:二维数组中的第一个元素的值;即:c[0][0] 所以: c 和 *