使用递归反转c中的字符串,而不使用任何其他数组或指针

时间:2017-09-20 14:24:33

标签: c string pointers recursion

#include<conio.h>
#include<stdio.h>
void main() 
{
    char strr[10]="hello";
    char *st;
    printf("%s",strr);
    st=strv(strr);
    printf("%s",st);
}
char* strv(char *str)
{
   static int i,j;
   char a;
   if(str+1!=NULL) 
   {
      a=*str;
      i++;
      strv(++str);
     *(str-i+j)=a;
     j++;
     return str;
   }
}

代码“strv的冲突类型”中有一个错误,我可以;弄清楚为什么。请用解决方案来响应通过递归反转数组而不使用任何其他数组或指针

3 个答案:

答案 0 :(得分:0)

考虑到约束,至少可以使用O(n ^ 2)算法。 函数定位结束,记忆最后一个字符,将其替换为零以进行下一级别,并在内部调用完成后交换数组开头和原始最后一个字符。

void rev(char *a) {
   int l=strlen(a);
   if (l<2) return;  // nothing to swap if l==0 or l==1
   char b=a[l-1];    // have to remember the ending character
   a[l-1]=0;         // and have to set it to zero for next level
   rev(a+1);
   a[l-1]=a[0];
   a[0]=b;
}

要解决编译错误,最简单的方法是将子例程放在main()。

之前

答案 1 :(得分:0)

解决方案是制作一个swap function并从数组的开头,结尾到中间。 虽然first "iterator" or "pointer"小于end "pointer",但继续进行交换。

我的建议是,当您使用代码时,我的代码中的0和我的代码中的4会更改为变量,例如:begin end它会使您的代码可读并且易于更改

这是我的代码:

void swap(char* first, char* last){
    if(first > last){
        return;
    }
    char tmp = *first;
    *first=*last;
    *last=tmp;
    swap(first+1 , last -1);
}

int main() 
{    char strr[10]="hello";
    char *st;
    swap(&strr[0],&strr[4]);
    printf("%s",strr);
    return 0;
}

答案 2 :(得分:-2)

您需要为“strv”功能添加减速度。

因为函数strv是在函数main之后实现的,所以在函数main的范围内,“strv”在未知。

您应该为函数main上方的函数strv添加减速度:

char* strv(char *str);

一般经验法则:总是添加功能减速以避免这些情况。

完整示例:

#include<conio.h>
#include<stdio.h>

char* strv(char *str);

void main() 
{
    char strr[10]="hello";
    char *st;
    printf("%s",strr);
    st=strv(strr);
    printf("%s",st);
}

char* strv(char *str)
{
    static int i,j;
    char a;
    if(str+1!=NULL) 
    {
        a=*str;
        i++;

        strv(++str);
        *(str-i+j)=a;
        j++;
        return str;
    }
}