2017-05-27 10 views
0

Ich versuche, eine Funktion in C zu schreiben, die 2 Zeiger erhält, einen für das erste Zeichen in einer Zeichenfolge und das andere für das mittlere Zeichen in der Zeichenfolge. Die Funktion muss überprüfen, ob die erste Hälfte der Zeichenfolge die gleiche wie die zweite Hälfte ist (Groß- und Kleinschreibung wird ignoriert) und gibt "TRUE" oder "FALSE" zurück.C - Rekursion mit Strings

Ich weiß nicht, was die Bedingung für die Rekursion stoppt und warum es nicht funktioniert.

Hier ist mein Code. Was ist der Fehler?

#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; 
} 

habe ich es zu diesem Code

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; 
} 

und nun seine Arbeit, aber nur für das erste Zeichen und Mitte seines bewegen sich nicht das nächste Zeichen Hilfe jemanden zu überprüfen, was worng ???

+0

Die 'pstart' und' pmiddle' Variablen in den 'main' Funktionen sind * einzelne Zeichen *, keine Zeiger. Ihre Funktion wird für diese Variablen gesperrt und Sie haben ein * undefiniertes Verhalten *. –

+0

also ändern Sie es in '* pstart'? –

+0

Dies sollte mit einer Compiler-Warnung krächzen, da der rekursive Pfad keinen Wert zurückgibt. Sie rufen nur 'CheckString()' auf, geben ihren Rückgabewert nicht in der Rekursionskette zurück. Und ja, 'pstart' und' pmiddle' müssen Zeiger auf den Anfang und die Mitte der ursprünglichen Zeichenfolge sein, nicht Kopien der Zeichen an diesen Stellen, wie sie derzeit implementiert sind. – dhke

Antwort

0

sagte Wie @ some-Programmierer-dude, pstart und pmiddle sind nur Zeichenvariablen, die den Wert von str[0] und str[(strlen(str) - 1)/2] und nicht ihre jeweiligen Adressen zugewiesen wurden. In der Funktion übergeben Sie die Adressen pmid und pstart. Sie sollten den Code wie folgt ändern:

ersetzen pmid und pstart. Anstatt sie zu Zeigern zu ändern -

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

ich habe es geändert, aber immer noch nicht tun, was suppost zu tun ist ... es immer zurück 1 ... –

+0

kannst du bitte meinen Code überprüfen und mir sagen was was ist? @Amarnath Karthi –

0

ich denke, dass Sie das noch mit Schleifen archivieren können. Hier ist Ihr modifizierter Arbeitscode. behebe Probleme, die von anderen erwähnt wurden.

#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; 
} 

rekursive Version

#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

aber warum warum ??????? Ich weiß, wie man es mit Schleifen macht, ich fragte, wie man es mit Rekursion macht ............... RECURSION !! –

+0

@ monkey.D.Ganga Rekursive Version hinzugefügt –

0

Die anderen Antworten das Hauptproblem hinweisen, die die Tatsache ist, dass Sie den Wert durch die rekursiv aufgerufenen Funktion zurück zurückkehren müssen, aber es gibt andere Probleme in deinem Code.

Wenn fgets verwendet wird, um die Benutzereingabe zu erfassen, kopiert es auch das Newline-Zeichen und das macht Ihre Funktion fehlgeschlagen. Hier

ist eine mögliche Lösung, mit einigen anderen Hinweise:

#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; 
}