我编写了一个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];
}
}
但是当我打印整个数组时,它会返回数组末尾的@,而当我逐个打印数组元素时,它不存在。 请告诉我它是什么?
答案 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));