c - 使用递归反转字符串

标签 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;
}

最佳答案

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

The behavior is undefined if str is not a pointer to a null-terminated byte string

因此,快速修复如下:

...
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]);
}

关于c - 使用递归反转字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41871682/

相关文章:

c - 使用 ","和 "{}"打印格式化数组

C:当所有类型相同时用不同的类型重新声明

c# - 为什么使用 .NET 框架的程序比非托管代码中的相同程序小?

java - 如何保存字符串字节而不丢失信息?

javascript - JavaScript的严格模式是如何实现的

c++ - 从/向一个发送者/接收者并发接收/发送

string - 将无界字符串转换为整数 Ada

python - 一个字符串上的列表理解窃听似乎不是 '' 或 "\r\n"

javascript - 如何基于 api 调用遍历树/数组 -Javascript

python - 从左递归求解M位数字