使用递归的字符串反向

时间:2017-01-26 10:42:32

标签: c string recursion

有人可以告诉我我的代码中有什么问题吗? 它显示出一些奇怪的输出。

#include<stdio.h>
#include<string.h>
void reverse(char string[])
{
    char b[200];
    int t;
    t = strlen(string);
    if (t==1)
        printf("%c",string[0]);
    else
    {
        printf("%c",string[t-1]);
        for (int i=0;i<t-1;i++)
            b[i]=string[i];
        reverse(b);
    }
}
int main()
{
    char a[200];
    scanf("%s",&a);
    reverse(a);
    return 0;
}

3 个答案:

答案 0 :(得分:2)

如果您曾尝试使用调试器,您会发现t在第二次迭代时会发疯。这是因为在将string复制到b后,您忘记在末尾插入\0符号(索引为t-1的位置)。由于t需要空终止字符串,这会导致strlen()在下一次迭代中成为字面上的任何,并导致未定义行为,如docs中所述:

  

如果str不是指向以null结尾的指针,则行为未定义   字节串

快速修复如下:

...
for (int i=0;i<t-1;i++)
{
    b[i]=string[i];
}
b[t-1] = '\0';
reverse(b);
...

正如@LPs在评论中已经提到的那样:将scanf("%s",&a);更改为scanf("%199s",a);(199因为我们需要在末尾为'\ 0'留一个空格,感谢@RoadRunner注意到)

注意:查看strncpy_s(如果您使用的是C11)并使用它代替for循环:

printf("%c",string[t-1]);
strncpy_s(b, 200, string, t-1);       // 200 because char b[200]
reverse(b);

strncpy

printf("%c",string[t-1]);
strncpy(b, string, t-1); 
b[t-1] = '\0';
reverse(b);

另一种方法是不复制:

else
{
    string[t-1] = '\0';    // you don't need array 'b' at all
    reverse(string);
}

最简单的方法就是使用循环:

for (int i = strlen(string) - 1; i >= 0; --i)
{
    printf("%c", string[i]);
}

答案 1 :(得分:0)

使用递归来反转字符串的最简单方法是:

&#13;
&#13;
    // C++ program to reverse a string using recursion
# include <stdio.h>
# include<string>
using namespace std;
 
string in="";
/* Function to print reverse of the passed string */
void reverse(char *str)
{
   if (*str)
   {
       reverse(str+1);
       in=in+*str;   /* If you want to save the reversed string */
       printf("%c", *str);  /*If you just want to print the reversed string */
   }
}
 
/* Driver program to test above function */
int main()
{
   char a[] = "Reversing a string using recursion";
   reverse(a);
   printf("\n%s\n",in.c_str());
   return 0;
}
    /* output : noisrucer gnisu gnirts a gnisreveR */
&#13;
&#13;
&#13;

说明:

递归函数(反向)将字符串指针(str)作为输入,并使用下一个位置调用自身来传递指针(str + 1)。递归以这种方式继续,当指针到达'\ 0'时,堆栈中累积的所有函数在传递的位置(str)打印char并逐个返回。

Time Complexity: O(n)

答案 2 :(得分:0)

在一个函数中混合使用两种方法,即递归和循环。此外,对我来说,仍然不清楚是否要将输入字符串更改为相反的顺序,或者您只是想以相反的顺序打印输出字符串。 无论如何,请参阅提供基于反向打印和基于递归的反向打印的循环基础的解决方案;希望它有助于理解代码所经历的步骤:

#include <stdio.h>
#include <string.h>

void reverse_loop(char string[]) {
    long i = strlen(string) - 1;
    while (i >= 0)
        printf("%c",string[i--]);
}

void reverse_recursive (char string[]) {
    if (string[0] != '\0') {
        reverse_recursive(&string[1]);
        printf("%c", string[0]);
    }
}

int main()
{
    char a[200] = { "some test string" };
    reverse_recursive(a);
    return 0;
}