# Strings vergleichen, wichtig



## Maniac1983 (11. Januar 2005)

Hi,

ich habe folgendes Problem:
muss bis donnerstag folgendes Problem lösen, hab aber keine ahnung wie...

wir sollen programm entwerfen,
das strings miteinander vergleicht, wie im duden...

dabei muss funktion umwandeln();
 ä ö ü und ß in a, u, o und ss nicht in ae, ue, oe usw umwandeln (regel nach duden)
außerdem muss funktion umwandeln alles in kleinbuchstaben umwandeln

main funktion muss
2 strings einlesen
ausgaben erzeugen (verglichene strings)

funktion compareStr() muss
beide strings vergleichen, 1 zurückgeben, wenn string1 vor string 2 stehen würde,
-1 zurückgeben, wenn string 2 vor string 1 kommt und
0 zurückgeben, wenn beide strings gleich sind 

wichtig die funktion cmpstr() darf nicht benutzt werden (soll wohl in etwa nachprogramm werden)

Kann mir bitte jemand eine lösung(code) posten,
meine kommilitonen können nicht helfen
wär allen sehr sehr dankbar !

Liege grüße
maniac


----------



## blackbirdthefirst (11. Januar 2005)

Hallo muss das Programm in C oder in C++ sein, oder ist es egal?


----------



## Maniac1983 (11. Januar 2005)

Hi,
das muss in c++ programmiert sein

danke für dein interesse


----------



## Daniel Toplak (11. Januar 2005)

Also wenn C++ dann nimm die std::string Klasse und cin/cout zum einlesen und ausgeben (dazu die << >> Schiebeoperatoren verwenden).

Grober Ablauf:
1. Strings einlesen mit cin in 2 Variablen
2. Teile ersetzen, also ä nach a usw...
Dazu gehst du die jeweiligen Strings deichenweise "durch" und vergleichst das jeweilige Zeichen mit dem zu ersetzenden, wenn die übereinstimmen, dann einfach an der gefunden Stelle ersetzten.
Dazu ließ dir bitte die Referenz zu std::string in der STL durch (STL=Standard Tamplate Library)
3. Strings in Kleinbuchstaben verwenden, dazu wieder zeichenweiße durchlaufen und jedes Zeichen auf den jeweligen ASCII-Wert vergleichen, dann entsprechen ersetzten
4. Vergleichen, die beiden Strings mit dem operator==() der Klasse std::string vergleichen.

Im Falle von C (was ich eher glaube) hast du keine Stringklasse und musst das ganze mit nullterminierten char-Arrays machen, dabei kommst du am besten mit Zeigeraritmetik voran.

Gruß Daniel


----------



## blackbirdthefirst (11. Januar 2005)

Habe dir das ganze einmal mit C-Strings Programmiert.
Finde den ganzen Overhead der c++ string Klasse sowiso viel zu groß für so ein bisschen String arbeit und man kann die Zeichen auch noch einfacher einzeln Prüfen.
Des weiteren sagtest du zwar das es in c++ geschrieben sein muss, aber
c ist ja sowiso eine Teilmänge von c++ und du kannst ja auch in c++ sämtliche c Headerdateien benutzen.

Hier einmal das Prog  auch ganz gut habe es schon ausprobiert, kompelier es die einfach mal und schau ob es was für dich ist.

```
#include <stdio.h>

#define MAX_CHR 100 

// Funktion für das Entfernen des Newline Zeichens "\n"
void chomp(char *str) {
   size_t p=strlen(str);
   /* \n mit \0 Überschreiben */
   str[p-1]='\0';
}

// Übernommen aus Beitrag: strings vergleichen in diesem
// Forum
int compareStr(unsigned char* str1, unsigned char* str2){
        for(i = 0;;i++){ 
                if(str1[i] < str2[i]) return -1;
                else if(str1[i] > str2[i]) return 1; 
                if(!str1[i] || !str2[i]) break;
        }
        return 0;
}

void umwandeln(unsigned char *convert){
   int n;
   
   for (n = 0; convert[n] != '\0'; n++) {
      
      // Alle Buchstaben in Kleinbuchstaben umwandeln
      if(convert[n] >= 'A' && convert[n] <= 'Z') 
         convert[n] = convert[n] - 'A' + 'a';
   
      // ä und Ä --> a  
      if(convert[n] == 132 || convert[n] == 142)
      {   convert[n]='a';
          continue;
      }
      // ü und Ü --> u
      else if(convert[n]== 129 || convert[n] == 154)
      {
          convert[n]='u';                     
          continue;
      } 
      // ö und Ö --> o                  
      else if(convert[n] == 148 || convert[n] == 153)
      {
           convert[n]='o';
           continue;
      }       
      // ß --> s        
      else if(convert[n] == 225)
      {                          
           convert[n]='s';
           continue;
      }
   }
}

int main() {
   unsigned char str1[MAX_CHR];
   unsigned char str2[MAX_CHR];
   
   // Ersten Suchstring einlesen
   printf("1. Suchstring (max %i Zeichen):", MAX_CHR);
   fgets(str1,MAX_CHR,stdin );
   chomp(str1);
   
   // Zweiten Suchstring eingeben
   printf("2. Suchstring (max %i Zeichen):", MAX_CHR);
   fgets(str2,MAX_CHR,stdin );
   chomp(str2);
           
   // Beide Strings in Kleinbuchstaben umwandeln
   umwandeln(str1); 
   umwandeln(str2);
   
   printf("\nWandle Sting in Kleinbuchstaben um Umwandlung:\n");
   printf("\tSuchstring 1: %s\n", str1);
   printf("\tSuchstring 2: %s\n", str2);
   
   printf("\nVergleiche: \"%s\" mit \"%s\"\n\n", str1, str2);
   printf("Ergebniss: %i", compareStr(str1, str2) );
   
   getchar();
   exit(0);
}
```


----------



## Martin Schroeder (27. Januar 2005)

Wieso steht denn exit(0) am Ende? Könnte man doch auch "return 0;" schreiben.


----------

