簡體   English   中英

使用遞歸反轉數組內容(C 語言)

[英]Reverse array content using recursion (C Language)

函數 reverseAr() 接受兩個參數,一個字符數組 (ar[]) 和數組的大小 (n),然后反轉數組的內容(不使用另一個數組)。 然后,該函數將通過參數 ar 將結果返回給調用函數。

我的代碼似乎無法運行,我想我在函數之間錯誤地傳遞了值,但我不知道在哪里。

這是代碼:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <string.h> 
#include <math.h> 

void reverseAr(char ar[], int n);

int main()
{
    char str[128];
    int len;

    printf("\nEnter an array of characters: ");
    gets(str);
    len = strlen(str);
    printf("The reversed array of characters is = %s\n", reverseAr(str, len));

    return 0;
}

void reverseAr(char ar[], int n)
{
    char temp = ar[0];
    ar[0] = ar[n - 1];
    ar[n - 1] = temp;
    if (n > 1) 
    {
        reverseAr(++ar, n - 2);
    }
}

預期輸出:

Enter an array of characters: abcde
The reversed array of characters is = edcba

這個:

char str;

gets(str);

是未定義的行為,應該給出您忽略的編譯器警告(甚至錯誤)。

gets()需要一個指向字符數組的指針,你給它一個單個字符的值,這根本不是一回事。 它將將該字符的未定義值解釋為地址,並將輸入文本存儲在那里。

它應該是:

int main()
{
  char line[128];

  printf("\nEnter an array of characters: ");
  if(fgets(line, sizeof line, stdin) != NULL)
  {
    const size_t len = strlen(line);
    printf("The reversed array of characters is = %s\n", reverseAr(line, len));
  }
  return 0;    
}

strlen()的返回類型不是int ,它是size_t所以你應該使用它,並相應地改變reverseAr()

這是反轉字符串的工作代碼

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <string.h> 
#include <math.h> 

int reverseAr(char ar[], int , int);

int main()
{
    char str[128];
    int len;

    printf("\nEnter an array of characters: ");

    if(fgets(str, sizeof(str), stdin) != NULL)
    {
        len = strlen(str);
        reverseAr(str, 0, len-1);
    }
    printf("The reversed array of characters is = %s\n", str );
    system("pause");
    return 0;
}

int reverseAr(char ar[], int first, int last)
{
    char temp = ar[first];
    ar[first] = ar[last];
    ar[last] = temp;

    if (first < last) 
    {
        reverseAr(ar, ++first, --last);
    }
    else
    {
        return 0;
    }
}

我認為問題在於你如何打印結果:

void reverseAr(char ar[], int n);
printf("The reversed array of characters is = %s\n", reverseAr(str, len));

printf 需要一個字符串,而您將它傳遞給 void ......

您應該將其替換為:

reverseAr(str, len-1);
printf("The reversed array of characters is = %s\n", str);

你會注意到我傳遞LEN-1 insted的的lenreverseAr那是因為你要離開的字符串(“\\ 0”)獨自一人在最后一個字符,只有切換字符的其余部分。 最終,您還想修復reverseAr函數:

void reverseAr(char ar[], int i, int n)
{
    char temp = ar[i];
    ar[i] = ar[n];
    ar[n] = t;

    if (i < n) 
    {
        reverseAr(ar, i++, n - 1);
    }
}

reverseAr(str,0,len-1);說法: reverseAr(str,0,len-1);

您可以使用指針而不是使用數組名稱在reverseAr函數中遞增(因為++ar無效)。

以下代碼應該可以工作:

/* In Main */

int main()
{
        char str[128];
        int len;

        printf("\nEnter an array of characters: ");
        gets(str);    /* use fgets instead */

        len = strlen(str) - 1;  /* length is one less than the strlen */

        printf("The reversed array of characters is = %s\n", reverseAr(str, len));

        return 0;
}

void reverseAr(char *ar, int n)
{
        /* Base case */
        if (ar > (ar + n))
        {
            return;
        }
        char temp = *ar;
        *ar = *(ar + n);
        *(ar + n) = temp;
        reverseAr(ar + 1, n - 1);
    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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