2017-05-27 57 views
0

我想在這C得到兩個指針,一個用於字符串的第一個字符,而另一個字符串中的中間人物寫一個函數。功能需要檢測是否有字符串的前半部分是相同的第二半(忽略大小寫),並返回"TRUE""FALSE"Ç - 遞歸處理字符串

我不知道停止條件的遞歸和爲什麼它不工作。

這是我的代碼。什麼是錯誤?

#define SIZE 80 
enum { FALSE = 0, TRUE = 1 }; 

int CheckString(char* start, char* middle); 

int main() 
{ 
    char str[SIZE], *pstart, *pmiddle; 

    printf("Enter a String-->:"); 
    fgets(str, SIZE, stdin); 

    pstart = &str[0]; 
    pmiddle = &str[(strlen(str) - 1)/2]; 

    printf(" %d \n", CheckString(pstart, pmiddle)); 

    return 0; 
} 

int CheckString(char* start, char* middle) 
{ 
    if (middle == '\0'); 
    return TRUE; 

    if ((*start == *middle) || (*start == *middle + 32) || (*start == *middle - 32)) 
     CheckString(start + 1, middle + 1); 
    else 
     return FALSE; 
} 

我改成了這個代碼

int CheckString(char* start, char* middle) 
{ 
    if ((*start == *middle) || (*start == *middle + 32) || (*start == *middle - 32)) 
    { 
     CheckString(start + 1, middle + 1); 
     return TRUE; 
    } 
    else 
     return FALSE; 
} 

,現在它的工作,但只對第一個字符和中間的不動什麼撥錯檢查下字符 幫助別人???

+0

的'pstart'以及'main'功能'pmiddle'變量*單個字符*,而不是指針。你的函數將跳出這些變量的界限,你將會有*未定義的行爲*。 –

+0

所以把它改成'* pstart'? –

+0

由於遞歸路徑沒有返回值,因此會發出編譯器警告。你只需調用'CheckString()',不要將它的返回值返回給遞歸鏈。是的,'pstart'和'pmiddle'需要指向原始字符串的開頭和中間,而不是當前實現的那些位置的字符的副本。 – dhke

回答

0

至於說通過@一些程序員,花花公子,pstartpmiddle是其被分配str[0]str[(strlen(str) - 1)/2],而不是他們各自的地址的值只是字符變量。在函數中,您傳遞的地址爲pmidpstart。如下 -

更換PMID和PSTART你應該改變的代碼。而是將它們改爲指針 -

char* pstart,pmid; 
pstart = &str[0]; 
pmiddle = &str[(strlen(str) - 1)/2]; 
+0

我改變了它,但仍然沒有做什麼事情...它總是返回1 ... –

+0

你可以檢查我的代碼,並告訴我什麼是工作? @Amarnath Karthi –

0

我認爲你仍然可以使用循環對其進行歸檔。這裏是你修改後的工作代碼。解決其他人提到的問題。

#define SIZE 80 
enum { FALSE = 0, TRUE = 1 }; 

int CheckString(char* start, char* middle); 

int main() 
{ 
    char str[SIZE]; 
    char *pstart = NULL; 
    char *pmiddle = NULL; 

    printf("Enter a String-->:"); 
    fgets(str, SIZE, stdin); 

    pstart = &str[0]; 
    pmiddle = &str[(strlen(str) - 1)/2]; 

    printf(" %d \n", CheckString(pstart, pmiddle)); 

    return 0; 
} 

int CheckString(char* start, char* middle) 
{ 
    int flag = 0; 
    char * end = middle; 
    while (start != end) { 
     if ((*start == *middle) || (*start == *middle + 32) || (*start == *middle - 32)) 
      flag = 1; 
     else 
      flag = 0; 

     start++; middle++; 
    } 

     return flag; 
} 

遞歸版本

#define SIZE 80 
enum { FALSE = 0, TRUE = 1 }; 

int CheckString(char* start, char* middle, char* end, int []); 

int main() 
{ 
    char str[SIZE]; 
    char *pstart = NULL; 
    char *pmiddle = NULL; 
    char *end = NULL; 
    int flag[1]; 
    *flag = 0; 

    printf("Enter a String-->:"); 
    fgets(str, SIZE, stdin); 

    pstart = &str[0]; 
    pmiddle = &str[(strlen(str) - 1)/2]; 
    end = pmiddle; 
    printf(" %d \n", CheckString(pstart, pmiddle , end, flag)); 

    return 0; 
} 

int CheckString(char* start, char* middle, char* end, int *flag) 
{ 

    if (start == end) 
     return *flag; 

    else 
    { 
     if ((*start == *middle) || (*start == *middle + 32) || (*start == *middle - 32)) 
      *flag = 1; 
     else 
      *flag = 0; 

     start++; middle++; 
     return CheckString(start, middle, end, flag); 
    } 


} 
+0

但爲什麼要???????我知道如何用循環做到這一點,我問如何用遞歸來做到這一點............... RECURSION! –

+0

@ monkey.D.Ganga新增遞歸版本 –

0

其他的答案指出的主要問題,這是你必須返回由遞歸調用函數的返回值的事實,但也有其他的問題在你的代碼中。

fgets用於收集用戶輸入,它會將換行符過,這讓你的函數失敗。

這裏是一個可能的修復,與一些其它的提示:

#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdbool.h> 

#define SIZE 160 

bool CheckString(char* start, char* middle); 

int main() 
{ 
    char str[SIZE]; 

    for (;;) 
    { 
     printf("Enter a String-->:"); 
     if (fgets(str, SIZE, stdin) == NULL) break; 

     // remove the newline copied in the string by fgets 
     size_t length = strcspn(str, "\n"); 
     str[length] = '\0'; 

     if (length == 0) continue; 

     printf("%s\n", CheckString(str, str + length/2) ? "True" : "False"); 
    } 

    return 0; 
} 

bool CheckString(char* start, char* middle) 
{ 
    if (*middle == '\0') return true; 
    // ^note this ^here there was a ; 

    if (tolower(*start) == tolower(*middle)) 
     return CheckString(start + 1, middle + 1); 
    else 
     return false; 
}