[英]Variable access in main function when returned by another function?
所以我在互聯網上看到這個代碼用於在C中使用遞歸來反轉字符串。
我理解除reverse
函數返回str1
的部分之外的代碼,然后在main
函數中打印str1
。 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);
}
}
對於初學者來說,你所展示的功能是錯誤的。 如果一個空字符串傳遞給這樣的函數
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);
然后將數組指示符轉換為指向其第一個元素的指針。 在函數內,數組不會從一個存儲區移動到另一個存儲區。 它停留在同一個地址。 只更改了數組的元素。 因此,在退出函數之后,將修改數組的元素,但在調用函數之前,它們將在內存中具有與數組中相同的地址。 實際上,數組元素通過引用傳遞給函數,該引用是指向數組的第一個元素的指針。
該函數不返回任何內容,它接收數組作為指向其第一個元素的指針(數組衰減成指向其第一個元素的指針)並且它在適當的位置執行轉置。 請注意,聲明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;
}
變量的引用是它的地址,或者更准確地說是保存地址的變量。
當你通過ref傳遞一個對象/變量時,你會通過它的地址傳遞它,在C中你可以通過在c#中傳遞變量的指針來實現它,例如,當你將一個參數傳遞給一個函數時,你需要聲明“ref”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.