Strings vergleichen



  • Hallo Forum,

    ich möchte Strings vergleichen:
    char *str1="abc";
    char *str2="aBc";

    Ich habe diese Seite mit Funktionen gefunden:
    http://www.cppreference.com/stdstring/

    Die toupper() Funktion bezieht sich nur auf ein Zeichen. Ich müßte mir also um obige Strings zu vergleichen eine eigene Funktion schreiben. Oder gibt es eine Bibliothek die sowas für mich macht?



  • Gib's bestimmt auch irgendwo, aber bis du die gefunden hast,
    hast du dir mit

    - for
    - strlen
    - toupper
    - strcmp
    

    10x eine eigene Funktion gebaut.



  • Ok. Dann mach ich mich mal an die Arbeit...



  • zwar nicht ANSI C, aber BSD konform: man: strcasecmp(3)



  • Auch nicht schlecht. Und als Dreingabe gibts meinen Papierflieger 😃

    int strCompare(const char *str1, const char *str2, int beCaseSensitive) {
      int i, lowerIt, retval;
    
      if (beCaseSensitive)
        lowerIt=32;
      else
        lowerIt=0;
    
      i=-1; retval=0;
      do {
        i++;
        if ((str1[i] | lowerIt) != (str2[i] | lowerIt)) {
          retval = 1;
          break;
        }
      } while (str1[i]!=0 && str2[i]!=0);
    
      return retval;
    }
    


  • Und gleich der erste Fehler: int beCaseSensitive müsste in int beNotCaseSensitive unbenannt werden weil der Algo genau verkehrt herum funktioniert...





  • wenn schon, dann so

    #include <string.h>
    #include <ctype.h>
    
    int
    stricmp (const char *str1, const char *str2)
    {
      char c1,c2;
      while(c1=*str1++, (c2=*str2++) && tolower(c1)==tolower(c2))
        ;
    
      return c1-c2;
    }
    

    😃



  • #include <ctype.h>
    
    int stricmp(const char *a, const char *b)
    {
    	int res;
    	while (!(res = tolower(*a) - tolower(*b)) && *a++ && *b++);
    	return res;
    }
    

    konfusius: deine funktion hat probleme bei ungleichlangen strings. der c1-term muss mit in die AND kette

    fuer volle kompatibilitaet waere ein "return (res > 0) - (res < 0);" zu benutzen.



  • hallo,

    ich habe das problem, dass ich 2 stings bzw. char arrays vergleichen will. allerdings werden die von unterschiedlichen stellen geliefert und haben dadurch binär teilweise untetschiedlich aufgebaut. die ganzen funktionen strcmp und so scheinen aber binär zu vergleichen geben mir immer unterschiede auch bei gleichem string aus.
    gibt es auch eine funktion wie z.b. bei java die .equals die inhalte vergleicht und nicht die bits?



  • degauss schrieb:

    allerdings werden die von unterschiedlichen stellen geliefert und haben dadurch binär teilweise untetschiedlich aufgebaut.

    Sind die Strings unterschiedlich codiert, oder was soll das bedeuten?

    Gibt doch mal ein Beispiel für deine "binär unterschiedlichen", aber inhaltlich gleichen Strings.



  • args hat sich erledigt...

    man sollte auf die richtige länge de vergleiches achten, wenn db2 hinten noch nen käse ranhängt...

    aber danke 😉



  • Hallo, bin ziemlich neu auf diesen Gebiet und hab da ne Frage.
    Ich möchte einen eingegeben Text auslesen und in einer if anweisung vergleichen,
    Beispielsweise so:

    #include <conio.h>
    #include <stdio.h>
    #include <iostream.h>
    #include <cmath.h>
    #include <stdlib.h>
    using namespace std;
    
    void main(void)
    {
      char *text;
      printf("Geben Sie bitte beispielsweise 'hi' ein: ");
    
      scanf("%c",&text);
    
      if(text=="hi")
      {
      printf("Hallo, habe dich verstanden");
      }
      else
      {
      printf("Ich verstehe diesen Ausdruck nicht: %c",text);
      }
    
      getch();
    }
    


  • Hallo, bin ziemlich neu auf diesen Gebiet und hab da ne Frage.

    Mach besser einen neuen Thread auf, hier kann man es leicht übersehen, vom Chaos ganz zu schweigen.

    using namespace std;
    

    Also C ist das nicht. 🙂

    scanf("%c",&text);
    

    Das holt nur ein Zeichen anstatt einer Kette von Zeichen. Und zu allem Überfluß zeigt text irgendwo hin... das ist eine schlechte Idee.

    text=="hi"
    

    Das kann nicht gehen, weil == nicht für Arrays erlaubt ist. Für Strings gibt es man: strncmp, aber dafür müsstest du erstmal einen String haben.



  • ok vielen dank 🙂 !
    muss mir was einfallen lassen



  • ok habs jetzt endlich ^^

    #include <conio.h> 
    #include <stdio.h> 
    #include <iostream.h>
    
    void main(void)
    { 
    char hi[] = "hi";
    char input[100];
    
    cin>>input;
    
    if(strcmp(hi, input) == 0) {
    	printf("Hallo wie gehts?");
            getch();
       }
    else
       {
            printf("Ich verstehe dich nicht");
            getch();
       }
    }
    


  • Und wenn du nun aus dem

    cin>>input;
    

    ein

    scanf("%s\n", input);
    

    machst, dann ist es sogar wirklich C!



  • oh ok danke ! 😃 kannst leider noch nicht so richtig unterscheiden was c und was c++ ist.

    musste jedoch aus

    scanf("%s",&input);
    

    das hier machen:

    cin.getline(input,100);
    

    ( ist vermutlich auch kein c )

    warum? weil scanf interpretiert keine Leerzeichen bei mir. Mit cin.getline klappts. Man kann jetzt im Konsolenfenster eins der folgenden Begriffe eingeben:
    "hi", "hallo", "wie gehts", "auch gut" , "chillen"
    die Konsole wird auf die Begriffe immer reagieren und antworten, probiers mal aus^^. (habs mit borland builder 6 gemacht)

    Der fertige Code sieht dann so aus:

    #include <conio.h>
    #include <stdio.h>
    #include <iostream.h>
    #include <fstream.h>
    
    void main(void)
    {
    bool bla;
    
    while ( bool bla=true )
    {
    char input[100];
    
    char hi[] = "hi";
    char hallo[] = "hallo";
    char wg[] = "wie gehts";
    char ag[] = "auch gut";
    char ch[] = "chillen";
    
    //scanf("%s",&input); // Funkzioniert auch, jedoch interpretiert keine Leerzeichen
    cin.getline(input,100); // Leerzeichen bei z.b. "wie gehts" werden jetzt akzeptiert
    
    if(strcmp(hi, input) == 0 ||strcmp(hallo, input) == 0)
       {
    	printf("Hallo\n");
    
       }
    else if(strcmp(wg, input) == 0)
       {
    	printf("gut und selbst?\n");
    
       }
    else if(strcmp(ag, input) == 0)
       {
    	printf("na was treibst du so\n");
    
       }
    else if(strcmp(ch, input) == 0)
       {
    	printf("chillen ist immer gut^^\n");
    
       }
    else
       {
            printf("Ich verstehe dich nicht\n");
    
       }
    bla = true;
     }
    }
    


  • bouuman schrieb:

    warum? weil scanf interpretiert keine Leerzeichen bei mir. Mit cin.getline klappts.

    probier mal mit gets() oder fgets().
    🙂



  • ;fricky schrieb:

    bouuman schrieb:

    probier mal mit gets() oder fgets().
    🙂

    ok versuch ich gleich hahaha... komm mir voll unfähig vor , was ich auch ein wenig bin :p



  • ;fricky schrieb:

    bouuman schrieb:

    warum? weil scanf interpretiert keine Leerzeichen bei mir. Mit cin.getline klappts.

    probier mal mit gets() oder fgets().
    🙂

    Gute Idee. scanf() ist manchmal ein wenig zickig, wenn es um Whitespace geht.
    Bei der Gelegenheit kannst du dir auch überlegen, warum man: fgets nicht so böse wie man: gets ist.

    komm mir voll unfähig vor , was ich auch ein wenig bin :p

    Irgendwie sind wir doch alle nur Sterbliche. 🙂


Anmelden zum Antworten