Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem Programmieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.01.2005, 11:28 Uhr
Gölti



Moin!
Wir haben hier ein Problem mit unserem Programm! Das Programm soll zwei Zeichenketten miteinander vergleichen(wie im Duden) und dann per Ausgabe zeigen, welches Wort vor dem anderen steht oder ob gar beide Wörter gleich sind!
Hier mein genaues Prob.: Und zwar soll ß zu ss werden, allerdings funktioniert dies nicht wirklich!
Als Beispiel, wenn man Maße und Masse eingibt, soll dies als gleiches Wort ausgegeben werden, da ja Maße zu Masse werden soll!!
Außerdem passt auch dies nicht: Masse(String1) und Massegläubiger(String2) soll verglichen werden! Und das Prog. gibt aus das String2 vor String1 steht! Ist aber auch falsch, da einmal nach dem e nichts kommt und dann einmal ein g. Aber warum er nicht weiter vergleicht oder was er vergleicht hab ich keine Ahnung.
Und noch eins: Kann man das Problem mit der ASCII Tabelle und den "magischen Zahlen" noch anders lösen?! Das man statt z.b. -114 wird zu A (siehe Umlaute ersetzen) einfach schreibt Ä wird zu A?!?!

Hier der Programmcode:


Code:
#include <iostream.h>
#include <conio.h>
#include <ctype.h>

/* Umlaute laut ASCII Tabelle
'Ä' ASCII Code: -114
'Ö' ASCII Code: -103
'Ü' ASCII Code: -102
'ä' ASCII Code: -124
'ö' ASCII Code: -108
'ü' ASCII Code: -127
'ß' ASCII Code: -31
*/

void machUmlauteWeg(char *mitUml, char *ohneUml) {
while (*mitUml!=0) {

// Den aktuellen Buchstaben des Wortes mitUmlauten ansehen:
switch (*mitUml) {

// Umlaute ersetzen
case -114: *ohneUml = 'A'; break;
case -103: *ohneUml = 'O'; break;
case -102: *ohneUml = 'U'; break;
case -124: *ohneUml = 'a'; break;
case -108: *ohneUml = 'o'; break;
case -127: *ohneUml = 'u'; break;
case -31: *ohneUml = 's';
ohneUml++;
*ohneUml = 's';
break;

// Wenn kein Umlaut vorhanden ist, wird der Buchstabe einfach übernommen
default:
*ohneUml = *mitUml;
}

// Der nächste Buchstabe wird überprüft
mitUml++;
ohneUml++;
}
*ohneUml=0;
}

int compareStr(char *a, char *b){
while (*a!=0 && *b!=0) { // Vergleich
if (*a==0) return -1;
if (*b==0) return 1;
char ca = tolower(*a); // tolower, wandelt Großbuchstaben in Kleinbuchstaben um
char cb = tolower(*b);
if (ca<cb) return 1;
if (ca>cb) return -1;
a++;
b++;
}
// Bis hierhin sind beide Zeichenketten gleich, allerdings muss (wenn nötig) noch das Ende des einen Wortes überprüft werden
int lenA=strlen(a);int lenB=strlen(b);
if(a>b)
return -1;
else if(a<b)
return 1;
else
return 0; // Beide Zeichenketten sind gleich

}
int main(void)
{
const int elemente = 50;
char str1[elemente];
char str2[elemente];

cout << "\nProgramm zur Anordnung der Woerter";

cout << "\n\nBitte geben Sie die erste Zeichenkette ein (max. 50 Zeichen): ";
cin.getline(str1, elemente);
cout << endl;

// An dieser Stelle werden die Umlaute zu normalen Buchstaben gewandelt
char str1ohneUmlaute[elemente] = { 0 };
machUmlauteWeg(str1, str1ohneUmlaute);
cout << "\nDie erste Zeichenkette ohne Umlaute ist: " << str1ohneUmlaute << endl;

cout << "\nBitte geben Sie die erste Zeichenkette ein (max. 50 Zeichen): ";
cin.getline(str2, elemente);
cout << endl;

// An dieser Stelle werden die Umlaute zu normalen Buchstaben gewandelt
char str2ohneUmlaute[elemente] = { 0 };
machUmlauteWeg(str2, str2ohneUmlaute);
cout << "\nDie zweite Zeichenkette ohne Umlaute ist: " << str2ohneUmlaute << endl;

int ergebnis = compareStr(str1ohneUmlaute, str2ohneUmlaute);

if(ergebnis == 1)
{
cout << endl;
cout << "Wert 1" << endl;
cout << "String 1 ist im Duden vor String 2!" << endl;
}
else if(ergebnis == 0)
{
cout << endl;
cout << "Wert 0" << endl;
cout << "Die beiden Zeichenketten sind identisch!" << endl;
}
else if(ergebnis == -1)
{
cout << endl;
cout << "Wert -1" << endl;
cout << "String 2 ist im Duden vor String 1!" << endl;
}

getch();
return 1;
}



So ich hoffe ihr könnt mir BITTE BITTE möglichst schnell helfen, ist echt dringend!!!
DANKE im Vorraus!
MfG euer Lemony Snicket (Kumpel vom Gölti)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.01.2005, 13:23 Uhr
42



Hallo Kumpel vom Gölti,

zunächst mal zum Problem ß:

Das zweite s überschreibt hier einfach das Zeichen nach dem ß! Das muss natürlich eingefügt werden.

Zum zweiten Problem mit compareStr:

Meines Wissens gibt es damit in diesem speziellen Fall Probleme. In unserer Stringklasse arbeiten wir lieber mit memcmp und führen den Vergleich nur für soviel Bytes durch, wie der kleinere String Zeichen enthält. Sind beide Strings gleich und einer der Strings ist länger, wird das Ergebnis entsprechend zurückgeliefert.


C++:
int cstring::compare (const char *cp) const
{
  if (!cp || !*cp)
    return str->nchars;
  if (!str->nchars)
    return -1;
  int c, len = strlen (cp);
  if ((c = memcmp (str->carray,  cp,
                             min (str->nchars, (unsigned)   len))) != 0)
    return c;
  return (int)str->nchars-len;
}



str steht hier für den Inhalt der Klasse (also String1), der mit cp (also String2) verglichen wird. nchars enthält die Anzahl der Strings in der Klasse.

Ich musste mir den Code auch dreimal angucken. Der damalige Programmierer war einer von den Spezialisten, die C++ schrieben, aber den vom Compiler erzeugten Assembler schon im Kopf haben. Aber was solls, er funktioniert.

Noch zwei Hinweis:

1. Bei den Vergleichsfunktionen wird kleiner als < 0 und größer als >0 und nicht als -1 oder +1 definiert. Die Abfrage auf -1 und +1 ist also nicht ganz ungefährlich. Die oben angegebene Funktion liefert nicht 1, sondern im Fall von Masse und Massegläubiger 8 zurück (glaube ich).

2. Warum arbeitest Du nicht gleich mit widechars? Der Code funktioniert nur im Dos-Fenster mit korrekt eingestellter Code-Page. In anderen Fällen kannst Du die Tabelle vergessen. widechars sind da sicherer, weil klar definiert.

Ich hoffe, das hilft weiter.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: