2017-05-27 42 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; 
}