wra*_*ler 3 c string data-structures
在最近的一次采访中,我被问到一个非常简单的问题,即在没有任何额外变量和任何内置函数的情况下反转字符串(不仅仅是打印).我能想到的最接近的是:
#include<stdio.h>
#include<string.h>
int main()
{
char ch[100];
scanf("%s",&ch);
int i=0;
while(i<strlen(ch)/2)
{
ch[i]=ch[strlen(ch)-1-i]+ch[i];
ch[strlen(ch)-1-i]=ch[i]-ch[strlen(ch)-1-i];
ch[i]=ch[i]-ch[strlen(ch)-1-i];
i++;
}
printf("%s",ch);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用变量时拒绝了我的解决方案i.如果不使用计数器变量,这怎么可能呢?有没有其他方法可以解决这个问题?
编辑
这些是确切的问题(无论或多或少):
在C中不使用任何变量或内置函数来反转字符串.
两个可能的实现:一个只反向打印字符串.另一个反转字符串在内存和就地.两者都假设允许定义自己的递归函数,并且参数不计为变量.在任何情况下,参数本身都是const蚂蚁,因此可以说不是变量.
void printRev(const char * const s){
if(*s != '\0'){ // or just: if(*s){
printRev(s + 1);
putchar(*s);
}
}
Run Code Online (Sandbox Code Playgroud)
是否通过字符串'前缀'递归:首先递归直到到达结尾,然后在递归调用返回后打印每个字符.
void revStr(char * const s, const int len){
if(len > 0){
if(s[0] != s[len]){
s[0] ^= s[len];
s[len] ^= s[0];
s[0] ^= s[len];
}
revStr(s + 1, len - 2);
}
}
Run Code Online (Sandbox Code Playgroud)
稍微复杂一点:它将字符串的'first'字符与'last'进行异或交换.然后使用下一个字符作为字符串的开头进行递归,并将长度减少2.因此,在下一次迭代中,第二个字符成为第一个字符,倒数第二个字符成为最后一个字符.为此,s指针本身仍然是const,但显然指向的字符被修改.
第二个函数需要字符串长度作为输入参数,这也可以(递归地)完成,而不需要内置strlen函数:
int myStrlen(const char * const s){
if(*s != '\0'){
return 1 + myStrlen(s + 1);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ADDIT
这是一个不使用长度参数的版本,但需要一个不相交的输出字符串,并且输入字符串是可修改的.它通过用NUL字符替换最后一个字符来模拟len - 2表达式.revStrsrc
void copyRev(char * const restrict dst, char * const restrict src){
if(src[0] != '\0'){
dst[0] = src[myStrlen(src) - 1];
dst[myStrlen(src) - 1] = src[0];
src[myStrlen(src) - 1] = '\0';
copyRev(dst + 1, src + 1);
}
}
Run Code Online (Sandbox Code Playgroud)