无变量字符串反向
发布时间:2020-12-16 09:59:21 所属栏目:百科 来源:网络整理
导读:参见英文答案 Is it possible write a function that can reverse a string without using a buffer string? ????????????????????????????????????2个 ???????????? How to reverse a string without using in-built and temporary variables ?????????????
参见英文答案 >
Is it possible write a function that can reverse a string without using a buffer string? ????????????????????????????????????2个
>???????????? How to reverse a string without using in-built and temporary variables ????????????????????????????????????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中不使用任何变量或内置函数来反转字符串. 解决方法
两个可能的实现:一个只反向打印字符串.另一个反转字符串在内存和就地.两者都假设允许定义自己的递归函数,并且参数不计为变量.在任何情况下,参数本身都是常量,因此可以说不是变量.
void printRev(const char * const s){ if(*s != ' '){ // or just: if(*s){ printRev(s + 1); putchar(*s); } } 是否通过字符串’前缀’递归:首先递归直到到达结尾,然后在递归调用返回后打印每个字符. 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带有’last’的字符串的’first’字符.然后使用下一个字符作为字符串的开头进行递归,并且长度减少2.因此,在下一次迭代中,第二个字符成为第一个字符,倒数第二个字符成为最后一个字符.为此,s指针本身仍然是const,但显然指向的字符被修改. 第二个函数需要字符串长度作为输入参数,这也可以(递归)完成,而不需要内置的strlen函数: int myStrlen(const char * const s){ if(*s != ' '){ return 1 + myStrlen(s + 1); } return 0; } ADDIT 这是一个不使用长度参数的版本,但需要一个不相交的输出字符串,并且输入字符串是可修改的.它通过用NUL字符替换src中的最后一个字符来模拟revStr中的len-2表达式. void copyRev(char * const restrict dst,char * const restrict src){ if(src[0] != ' '){ dst[0] = src[myStrlen(src) - 1]; dst[myStrlen(src) - 1] = src[0]; src[myStrlen(src) - 1] = ' '; copyRev(dst + 1,src + 1); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |