c

时间:2017-11-23 05:53:46

标签: c

我编写了一个c程序来递归反转10个char数组:

#include<stdio.h>
void rev(char *, char *);
int a = 0;
void main()
{
    char in[10], out[10];
    scanf("%s", in);
    rev(in, out);
    printf("in  is:%s\n", in);
    printf("out is:%s\n", out);
    for(a = 0; a < 10; a++)
    {
        printf("out[%d] is:%c\n", a, out[a]);
    }
}
void rev(char *in, char *out)
{
    if(a < 10)
    {
        a++;
        rev(in, out);
        out[9 - (--a)] = in[a];
    }
}

但是当我打印整个数组时,它会返回数组末尾的@,而当我逐个打印数组元素时,它不存在。 请告诉我它是什么?

1 个答案:

答案 0 :(得分:0)

rev正在反转整个in数组,而不仅仅是包含用户输入的部分。因此,它会在输入后复制未初始化的值。

您在打印out时看到的输出与打印单个字符时不同的原因是因为您没有向out添加空字节。因此,当它查找空字节时,打印字符串会越过数组的末尾。

您应该只将数组的部分反转到strlen(in)而不是整个数组。

您还应该将a作为参数传递,而不是使用全局变量。

最后,当你到达终点时,你需要在输出字符串中添加一个空字节。

void rev(char *in, char *out, start, len)
{
    if(start < len)
    {
        rev(in, out, start + 1, len);
        out[len - start-1] = in[start];
    } else {
        out[start] = '\0';
    }
}

并称之为:

rev(in, out, 0, strlen(in));