2017-09-14 49 views
-1

這裏是我的代碼,我似乎無法弄清楚如何使該函數只有數組作爲參數。使用遞歸在C中反轉字符數組

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 

     char strArray[30] = "Print this string backward."; 

     puts(""); 
     stringReverse(strArray); 

     return(0); 
} 


void stringReverse(char strArray[]) 
{ 

    if(strArray != "\n") { 
     stringReverse(&strArray) 
     printf("%s", strArray) 
    } 
} 
+3

比較'strArray = 「\ n」'永遠是正確的,因爲你在做指針比較,而不是比較實際的字符串!使用'strcmp'來進行字符串比較。 –

+0

void f(char \ * a,char \ * b){char \ * t; if(a> = b)return; t = * a; * a = * b; * b = t; f(++ a , - b);} char \ * h(char \ * a){if(a)f(a,a + strlen(a)-1); return a;}調用的函數是h()遞歸函數是f(我不確定是否寫入-1) – RosLuP

+0

@ RosLuP--註釋中的代碼有錯誤:'char * t; ' - >'char t;'。但是,除此之外它應該工作。雖然,OP似乎希望反向打印一個字符串,而不是反轉一個字符串。這可能比OP想要的要多一點,我懷疑練習的重點是理解堆棧幀。儘管如此,你應該把你的評論變成一個完整的答案,並附帶工作示例代碼;這會對下面的答案做出很好的補充。 –

回答

0

首先,您需要返回一個值。

然後,你的算法應該做什麼?運行,直到你的字符串的最後,然後通過變量返回變量,只需要一個參數,好吧,你只需要在每個循環中傳遞這個參數。

像這樣:

#include "stdafx.h" 
#include "stdio.h" 
#include "stdlib.h" 
#include "string.h" 

void stringReverse(char strArray[], int i) { 
    if (strArray[0] != NULL) 
    if (strArray[0] != '\0') { 
     int c = 0; 
     char str[30]; 
     while (c < strlen(strArray)) { 
      str[c] = strArray[2 + c -1]; 
      c++; 
     } 
     str[c] = '\0'; 
     stringReverse(str); 
    }   
printf("%c", strArray[0]); 
} 

int main(int argc, char *argv[]) { 
    char strArray[30] = "Print this string backward."; 
    stringReverse(strArray, 0); 
    printf("\n\n"); 
    system("Pause"); 
    return(0); 
} 
+0

這個接受的答案有很多問題。爲什麼需要非標準的'stdafx.h'頭文件?你應該在系統頭文件名周圍使用尖括號。 'if(strArray [0]!= NULL)':這是錯誤的,因爲'strArray [0]'是'char',而'NULL'是空指針宏。 'stringReverse(str);':這個函數調用缺少一個參數。該代碼甚至不會編譯,並生成多個警告。 –

+0

@DavidBowling我從VS編輯器複製粘貼,這就是爲什麼有一些Visual C++的東西。但是是一個C代碼。是的,它運行完美。此外,我做了一個非常有教育意義的代碼,我知道可以優化很多。 –

+0

不知道爲什麼我以前的評論被刪除,但這個答案存在真正的問題,我在我的第一個評論(仍然在上面)中指出了這個問題,並且在刪除的評論中更明確地指出了這個問題。你應該修復你的答案;對於被接受的答案是正確的,這一點尤其重要。我已經低估了你的答案。如果您選擇修復答案,我會收回DV。 –

2

一些意見和批評:

並不需要張貼代碼math.hstdlib.h頭文件。雖然char strArray[30]足夠大以容納輸入字符串,但最好在字符串初始化程序中使用空括號,除非您需要比初始字符串更大的特定大小。這不太容易出錯,而且更容易,因爲不需要計算字符,也不需要記住爲空終止符包含空格。您可能希望將puts("");移至stringReverse()之後,因爲此功能不會打印換行符。對於像這樣的東西,通常使用putchar('\n');似乎更好; putchar()旨在打印只有一個字符,所以是正確的工具。

看來,與if (strArray != "\n") {}聲明的目標是檢查是否第一個字符是換行符,但有幾個問題。首先,"\n"是一個字符串,而不是一個字符;接下來,strArray是指向數組strArray[]的第一個字符的指針,而不是第一個字符本身。在輸入字符串中沒有'\n'字符,所以即使此條件被正確寫入,也總是如此,並且此代碼將進入無限遞歸。最後,傳遞給stringReverse()的參數從不改變,所以遞歸無法結束。爲了遞歸成功,基本情況必須被收斂。

一個解決方案是比較陣列的第一個字符與'\0'。如果第一個字符不是空終止符,則再次調用stringReverse()函數,這次的值爲strArray + 1。該程序將繼續遞歸調用stringReverse(),直到傳入一個空字符串爲止,此時最後一次呼叫stringReverse()返回給它的調用者(先前調用stringReverse()),在返回給調用者之前打印字符串的最後一個字符,....每個stringReverse()幀都按照調用它們的相反順序返回,並且這些幀中的每一個都打印該字符串的一個字符,直到最後到達第一幀,並且打印第一個字符,然後回到main()

請注意,在函數調用中,實際上大多數表達式中,數組衰減爲指向其第一個元素的指針。因此,在stringReverse()strArray是一個指向char的指針,指向調用者提供的作爲參數的數組的第一個元素。另請注意,在函數聲明中,如void stringReverse(char strArray[])將數組類型調整爲適當的指針類型,因此此聲明等效於void stringReverse(char *strArray)

#include <stdio.h> 

void stringReverse(char strArray[]); 

int main(void) 
{ 
    char strArray[] = "Print this string backwards."; 

    stringReverse(strArray); 
    putchar('\n'); 

    return 0; 
} 

void stringReverse(char strArray[]) 
{ 
    if (*strArray != '\0') { 
     stringReverse(strArray + 1); 
     putchar(*strArray); 
    } 
} 

程序輸出:

.sdrawkcab gnirts siht tnirP