2016-08-31 2 views
-2

vergleicht, muss ich zwei Zeichenketten compre und sie unter Verwendung der Rekursion vergleichen. dabei die Anzahl der Differenzen bis zu zwei zählen. Ich habe versucht, dies:Wie man zwischen zwei Zeichenfolgen unter Verwendung der Rekursion in C

int strcmp1(char *str1, char *str2){ 
int err=0; 
if(strlen(str1)-strlen(str2)>1 ||strlen(str1)-strlen(str2)<1) 
    return 0; 

if (*str1 =='\0' && *str2=='\0'|| err==2) 
    return err; 

if (*str1!=*str2) 
    err++; 

return strcmp1(str1 + 1, str2 + 1); 
} 

der Code i kehrt schrieb nur 0 oder 1, nicht die Menge der Unterschiede ... können Sie mir bitte sagen, was ich falsch mache? thx :)

+8

Ich wähle diese Frage zu schließen, wie Off-Topic, weil es eine Hausaufgaben Frage zeigt sich keine Mühe, um die Arbeit zu tun, . Aus der [Hilfe/Thema]: * Fragen für Hausaufgabenhilfe müssen eine Zusammenfassung der Arbeit, die Sie bisher zur Lösung des Problems getan haben, und eine Beschreibung der Schwierigkeit, die Sie haben, um es zu lösen habe keines dieser Dinge getan. –

+0

ok, ich habe einen Fehler gemacht. Ich hoffe, dass dies eine bessere Frage ist ... und diesen Punkt und für die Zukunft werde ich meine Wege zur Lösung des Problems hinzufügen –

+0

Wie definieren Sie die Anzahl der Unterschiede? Wie viele Unterschiede gibt es zwischen "tralfamador" und "ralfamador"? –

Antwort

0

-Code enthält mehrere Fehler:

  1. nicht strcmp() als Funktionsnamen verwenden, wenn Sie wirklich wissen, was Sie tun! Diese Funktion und ihre Semantik wird durch den C-Standard definiert. Der Compiler kann sich darauf verlassen und können Anrufe ersetzen durch eine effizientere Umsetzung

  2. strlen(str1)-strlen(str2) > 1 bis (definiert) unsigned integer Unterschreitungen anfällig ist und in den meisten Fällen halten (z strlen("a") - strlen("aaaaaaa") > 1 ist wahr).

    Verwenden strlen(str1) > strlen(str2) + 1 (in der Regel sollten Sie die + 1 Betrieb überprüfen bei Überflutungen zu)

  3. Die Modifikationen von err wird nie durch die rekursive Aufrufe zu sehen. Entweder deklarieren Sie es als static oder übergeben Sie es als Parameter an Ihre Funktion.

+0

THX für Ihre Erläuterungen, sie halfen mir viel, Buti kann nicht statische verwenden oder Fehler als Parameter verwenden ... die Funktion muss so sein, wie sie definiert und ohne statisch benutzen oder andere Funktionen aufrufen ... ich versuche es anders. Wenn es funktioniert, werde ich es posten ... –

0
  • wenn beide Strings leer sind (* str == 0) return true
  • wenn nur ein String leer ist, return false
  • wenn erste Zeichen sind nicht gleiche return false
  • andernfalls Rückkehr den Rest der Saiten

ich glaube, Sie zweite das Ergebnis des Vergleichs, wenn einige Fehler hat

+0

und wenn ich die genaue Anzahl der Fehler brauche, und nicht Thet gibt es? –

+0

die genaue Zahl ist 1, Sie überprüfen, ob sie beide leer sind – perreal

0

dies der letzte Code ist i'v geschrieben ...

#include <stdio.h> 
#include <string.h> 
int one(char* s1, char* s2){ 
    int two; 
    if(*s1==' '){ 
     two=one(s1+1,s2); 
     return two; 
    } 
    if(*s2==' '){ 
     two=one(s1,s2+1); 
     return two; 
    } 
    if(*s1=='\0' && *s2=='\0'){ 
     return 0; 
    } 
    if(*s1=='\0'){ 
     return strlen(s2); 
    } 
    if(*s2=='\0'){ 
     return strlen(s1); 
    } 
    two=one(s1+1,s2+1); 
    if (*s1==*s2){ 
return two; 
} 
    else{ 
     return two+1; 
} 
} 
void main(){ 
    int diff; 
    char str1[51],str2[51]; 
printf("enter the first string\n"); 
    scanf("%s", &str1); 
    printf("enter the second string\n"); 
    scanf("%s", &str2); 
    diff=one(str1,str2); 
    if(diff==1){ 
    printf("1\n"); 
} 
    else{ 
     printf("0\n"); 
} 
    } 
Verwandte Themen