一、题目描述
In the main() function, after ModifyString(text) is called, what’s the value of ‘text’?
1 int FindSubString( char* pch ) 2 { 3 int count = 0; 4 char * p1 = pch; 5 while ( *p1 != '\0' ) 6 { 7 if ( *p1 == p1[1] - 1 ) 8 { 9 p1++; 10 count++; 11 }else { 12 break; 13 } 14 } 15 int count2 = count; 16 while ( *p1 != '\0' ) 17 { 18 if ( *p1 == p1[1] + 1 ) 19 { 20 p1++; 21 count2--; 22 }else { 23 break; 24 } 25 } 26 if ( count2 == 0 ) 27 return(count); 28 return(0); 29 } 30 void ModifyString( char* pText ) 31 { 32 char * p1 = pText; 33 char * p2 = p1; 34 while ( *p1 != '\0' ) 35 { 36 int count = FindSubString( p1 ); 37 if ( count > 0 ) 38 { 39 *p2++ = *p1; 40 sprintf( p2, "%i", count ); 41 while ( *p2 != '\0' ) 42 { 43 p2++; 44 } 45 p1 += count + count + 1; 46 }else { 47 *p2++ = *p1++; 48 } 49 } 50 } 51 void main( void ) 52 { 53 char text[32] = "XYBCDCBABABA"; 54 ModifyString( text ); 55 printf( text ); 56 }
二、分析
FindSubString() 函数就是要找到一个先递增再递减且递增和递减的数量相等的回文序列,例如: ABCDCBA ,先是 后一项 = 前一项 ASCII 码 +1 , 后是 后一项 = 前一项 ASCII 码 -1 ,才能返回回文子串的长度,否则返回 0 。
ModifyString() 函数不断寻找上述类型的子串,如果不满足条件,就*p2++ = *p1++;当遇到 ABABA 中前一个 ABA 的时候,满足回文子串要求,此时 p1 指向 A BABA , p2 指向 ABABA ; sprintf 重定向修改 ABABA, B 变为 1 ,且跟随一个 ‘\0’ (该函数自动产生的) , 此时,字符串变为 A1‘\0’BA 。经过 while ( *p2 != '\0' ) 循环之后, p2 指向 A1‘\0’BA , p1 += count + count + 1 之后, p1 指向 A1‘\0’BA 。此时字符串已经被改动,之前的 ABABA 已经不存在,变为 A1‘\0’BA 。
再次进入 while ( *p1 != '\0' ) 循环之后,只能执行 else 部分的命令, p1 指向 p2 指向的元素的后一个,不断将 p1 指向的元素传给p2 所指向的位置,将原数据覆盖。所以, A1‘\0’BA ,依次变为 A1BBA 、 A1BAA 。即最终结果为 XYBCDCBA1BAA 。