这个问题已经有了答案:
Is it possible write a function that can reverse a string without using a buffer string? [duplicate]
2个答案
How to reverse a string without using in-built and temporary variables [duplicate]
1个答案
在最近的一次采访中,我被问到一个非常简单的问题:在没有任何额外变量和内置函数的情况下反转字符串(不仅仅是打印)。我能想到的最接近的是:

#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;
}

当我使用变量i时,我的解决方案被拒绝。如果不使用计数器变量,这怎么可能呢?有没有其他方法来解决这个问题?
编辑
这些是确切的疑问词(不多不少):
在C中不使用任何变量或内置函数来反转字符串。

最佳答案

两个三种可能的实现:一个只反向打印字符串。另一个在内存和位置反转字符串。两者都假设允许定义自己的递归函数,并且参数不算作变量。在任何情况下,参数本身都是constant,因此可以说不是变量。

void printRev(const char * const s){
    if(*s != '\0'){ // or just: if(*s){
        printRev(s + 1);
        putchar(*s);
    }
}

通过字符串执行“prefix”递归:首先递归到结束,然后在递归调用返回后打印每个字符。
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);
    }
}

更复杂的是:它XOR-swaps字符串的“first”字符和“last”。然后以下一个字符作为字符串的开头递归,长度减少了2。因此在下一次迭代中,第二个字符成为第一个字符,第二个到最后一个字符成为最后一个字符。为此,s指针本身仍然是const,但显然指向的字符已被修改。
第二个函数需要字符串长度作为输入参数,这也可以(递归地)完成,而不需要内置的strlen函数:
int myStrlen(const char * const s){
    if(*s != '\0'){
        return 1 + myStrlen(s + 1);
    }

    return 0;
}

添加
这里是一个不使用长度参数的版本,但是需要一个不相交的输出字符串,并且输入字符串是可修改的。它通过用nul字符替换len - 2中的最后一个字符来模拟revStr中的src表达式。
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);
    }
}

09-11 18:48
查看更多