[英]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的的len
到reverseAr
那是因為你要離開的字符串(“\\ 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.