所以我在互联网上看到了这个代码,用于在C中使用递归来反转字符串。
除了reverse
函数返回str1
然后str1
打印在main
函数中的部分之外,我理解了代码。 str1
未通过引用传递,但仅通过地址传递。那么当它通过main
函数打印时,如何打印反转的字符串而不是原始字符串?
void reverse(char str1[], int index, int size);
int main() {
char str1[20];
int size;
printf("Enter a string to reverse: ");
scanf("%s", str1);
size = strlen(str1);
reverse(str1, 0, size - 1);
printf("The string after reversing is: %s\n", str1);
return 0;
}
void reverse(char str1[], int index, int size) {
char temp;
temp = str1[index];
str1[index] = str1[size - index];
str1[size - index] = temp;
if (index == size / 2) {
return str1;
} else {
reverse(str1, index + 1, size);
}
}
答案 0 :(得分:1)
对于初学者来说,你所展示的功能是错误的。如果将空字符串传递给函数,就像这样
reverse(str1, 0, size - 1);
然后表达式size - 1
将等于-1
。因此,由于尝试在这些语句中访问数组之外的内存,该函数将具有未定义的行为
str1[index] = str1[size - index];
str1[size - index] = temp;
该功能有两个参数。字符串函数通常返回指向目标字符串的指针。因此,如果函数reverse
也返回指向字符串的指针,那将会更好。
可以更简单地定义。例如
char * reverse(char *s, size_t n)
{
if (!(n < 2))
{
char c = s[0];
s[0] = s[n - 1];
s[n - 1] = c;
reverse(s + 1, n - 2);
}
return s;
}
你可以称之为
printf("The string after reversing is: %s\n", reverse( str1, strlen( str1) ));
至于你质疑那个宣言
void reverse(char str1[], int index, int size);
等同于以下声明
void reverse(char *str1, int index, int size);
^^^^^^^^^^
当一个数组传递给tp这样的函数
reverse(str1, 0, size - 1);
然后将数组指示符转换为指向其第一个元素的指针。在函数内,数组不会从一个存储区移动到另一个存储区。它停留在同一个地址。只更改了数组的元素。因此,在退出函数之后,将修改数组的元素,但在调用函数之前,它们将在内存中具有与数组中相同的地址。实际上,数组元素通过引用传递给函数,该引用是指向数组的第一个元素的指针。
答案 1 :(得分:1)
该函数不返回任何内容,它接收数组作为指向其第一个元素的指针(数组将衰减成指向其第一个元素的指针)并且它在适当的位置执行转置。请注意,声明void reverse(char str1[], int index, int size)
等同于void reverse(char *str1, int index, int size)
。
代码有多个问题:
它对偶数长度的字符串不起作用。它甚至会在空字符串上调用未定义的行为。
它使用递归没有正当理由。一个简单的循环方法会更简单,并且具有更少的错误。
它有一个return str1;
语句,即使它被定义为void
。
该函数不返回任何内容,它接收数组作为指向其第一个元素的指针并执行转置。
这是一个更简单的选择:
#include <stdio.h>
char *reverse(char *str) {
for (size_t i = 0, length = strlen(str); i < length / 2; i++) {
char temp;
temp = str[i];
str1[i] = str1[length - i - 1];
str1[length - i - 1] = temp;
}
return str;
}
int main(void) {
char buf[100];
printf("Enter a string to reverse: ");
if (scanf("%s", buf) == 1) {
printf("The string after reversing is: %s\n", reverse(buf));
}
return 0;
}
答案 2 :(得分:1)
变量的引用是它的地址,或者更准确地说是保存地址的变量。
当您通过引用传递一个对象/变量时,您可以通过它传递它的地址,在C中,您可以通过在c#中传递变量的指针来实现它,例如,您需要声明&#34; ref&#34 ;将参数传递给函数时。