我编写了一个使用递归来反转字符串的程序。但我得到的输出总是一个空字符串。
我想知道我的逻辑有什么问题?
#include<stdio.h>
void reverse(char a[], int start, int end)
{
char t;
if(start>=end)
return;
else
{
t = a[start]; a[start] = a[end]; a[end] = t;
reverse(a,++start,--end);
}
}
int main(void)
{
char a[] = "hello";
int n = sizeof(a)/sizeof(a[0]);
printf("Given string is : %s ",a);
reverse(a,0,n-1);
printf("Reversed string is : %s ",a);
return 0;
}
输出:
打印我得到的个别字符,
答案 0 :(得分:9)
你的字符串实际上是6个字节长 - 'h', 'e', 'l', 'l', 'o', '\0'
。最后一个字符是空字节,它是一个字符串终止符。它向字符串结束的printf
或strlen
等函数发出信号。当你调用reverse
时,它会反转整个字符串,所以现在终结符是第一个字节,printf
将其解释为空字符串。
有两种方法可以解决这个问题。将传递给reverse
的索引缩小一个(调用reverse(a, 0, n-2)
),或使用strlen
代替sizeof
(int n = strlen(a)
)。
答案 1 :(得分:1)
永远记住,n
元素的数组索引为n-1
。
您的数组有6个元素,因此索引将从0
运行到5
,最后[6]元素是NUL
终结符。
根据您的逻辑,NUL
终结符成为反转数组中的第一个元素,因此没有输出为string
。
遵循逻辑,您对reverse()
的第一次调用应为reverse(a,0,n-2);
,以避免将NUL
作为反向数组中的第一个元素。