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 和 *