我很确定这是一个noob问题,但我无法找到问题的解决方案。我正在尝试创建一个递归函数,它接受一个字符串's'并返回该字符串但反转。我想通过两个函数可以做到这一点,一个将字符串中的字符复制到一个辅助函数,另一个函数再次从辅助函数复制到原始字符串(但这次是反转的)。但我想做一个能完成所有这些的功能。这就是我如何制作这个功能,但它不起作用:
/* external variables */
#define TRUE 1
#define FALSE 0
int e = 0;
i = 0;
int ret = FALSE;
char Saux[255];
void Inverse(char s[], int i) {
if (s[i] == '\n' || ret == TRUE) {
if (ret == FALSE) {
ret == TRUE;
i -= 1;
}
if (i == 0) {
s[e] = Saux[i];
return;
} else {
s[e++] = Saux[i];
return Inverse(s, i - 1);
}
} else /* this will happen until s[ i ] == '\n' */
{
Saux[i] = s[i];
return Inverse(s, i + 1);
}
}
我正在学习C,而且我对递归函数不太好,所以如果有更好的方法来实现这个功能,请告诉我。另外,英语不是我的母语,对任何拼写错误都很抱歉。谢谢。
答案 0 :(得分:5)
你的问题在这里:
ret == TRUE; // should be ret = TRUE;
也许你可以用不同的方式来思考你的问题:不是在字符串中两次,而是从字符串的开头(i
)和结尾(j
)开始。交换i
和j
处的字符并递增计数器(或分别递减),直至到达中间位置。
就像这样(这里end
表示最后一个元素,最初是字符串长度):
#include <string.h>
void swap(char* str, size_t i, size_t j) {
char tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
void reverse(char* str, size_t begin, size_t end) {
if(begin + 1 >= end)
return;
swap(str, begin, end - 1);
reverse(str, begin + 1, end - 1);
}
int main() {
char str[] = "foobar";
reverse(str, 0, strlen(str));
return 0;
}
答案 1 :(得分:0)
诀窍是让这些东西递归,然后将它与我们使用指针的能力结合起来。 当我们可以访问长度参数时,我们可以通过将指针向前移动一并在每一步将计数减少二来解决这个问题。
void reverseStringUsingLength(char* inputString, int len) {
if(len < 2) return;
char t = inputString[0];
inputString[0] = inputString[len-1];
inputString[len-1] = t;
reverseStringUsingLength(&inputString[1], len-2);
}
答案 2 :(得分:-1)
这是一个反向字符串
的简单代码#include <stdio.h>
#include <time.h>
char test[] = "HELLO";
void inverse(char s[], int start, int end){
if(end > start){
char temp = s[start];
s[start] = s[end];
s[end] = temp;
inverse(s, start+1, end-1);
}
}
int main(int argc, const char * argv[])
{
inverse(test, 0, strlen(test)-1);
printf("hello = %s\n", test);
return 0;
}