簡體   English   中英

另一個函數返回時,main函數中的變量訪問?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM