今天在C++论坛上看到一个关于字符串的面试题,反映很强烈,跟帖很多。所以把这道题整理出来,希望对大家以后有所帮助,具体见链接。
题目:
编写如下形式的字符串处理函数,要求将S1指向的字符串倒向复制给S2,如*S1 = "hello",则使 *S2 = "olleh"。
要求:
1:不能使用除S1,和S2以外的其余任何变量。
2:不能使用库函数函数名:
void reverse_str( const char* s1 ,char* s2);
分析:
由于这道题的要求是不能使用其他的变量和库函数,所以要把一个字符串翻转,没法用堆栈和自己写的相似函数。想到,递归可以得到堆栈的效果。所以递归比较好想到。
递归例子1:
void reverse_str(const char * str1, char * str2) { if(*str1 !='/0') { reverse_str(str1 + 1, str2); while(*str2 !='/0') { str2 ++; } * str2 = *str1; *(str2+1) = '/0'; } else { str2 = '/0'; } }
这个递归构造的很有技巧:在str1递归到结束字符'/0'时,str2 = '/0';语句把str2全部置空,为空字符串。
在递归回朔时,通过while(*str2 !='/0'),找到每次,队规的str2的结束为止,加入str1的值。完成翻转工作
非递归例子1
void reverse_str(const char * str1, char * str2) { if(str1 == NULL) { return ; } while((*str1)!='/0') { str1 ++; } str1 --;/*return the last the position of the last char from the end of char str1*/ while((*str1)!='/0') { (*str2) = (*str1); str2++; str1--; } *str2 = '/0'; }
这个例子,同样很有技巧,并且也容易懂。就是第一个while循环,找到str1的结束为止,在从结尾的为止,遍历到开始为止。达到翻转效果。