Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » kleines Problem bei Programmierung eines Duden

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 < [ 2 ]
000
20.01.2005, 16:12 Uhr
Gölti



Hallo,

habe folgenden Code geschrieben und bekomme es einfach nicht hin, dass er ä zu a macht, ö zu o, ü zu o und ß zu ss. Mir fällt absolut nicht ein wie ich das machen soll?!

Bitte helft mir!!!

Vielen Dank im voraus.


C++:
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>

int compareStr(char *str1, char *str2)
{
   int i;
   char cZeichen1,cZeichen2;
   for(i=0;str1[i]!='\0' || str2[i]!='\0';i++)  // || = logisches Oder
   {
      if(str1[i]<91)cZeichen1=str1[i]+32;   // alle kleiner als 91 und größer als 64 sind Grossbuchstaben
      else cZeichen1=str1[i];             // bei einer Addition mit der Zahl 32 werden sie in Kleinbuchstaben umgewandelt
      if(str2[i]<91)cZeichen2=str2[i]+32;
      else cZeichen2=str2[i];

      //Vergleich der beiden Zeichenketten
      if(cZeichen1 > cZeichen2)
         return (1);
      else if(cZeichen1 < cZeichen2)
         return (-1);
   }
   if(str1[i]=='\0')
   {
      if(str2[i]=='\0')return (0);      // Str1 und Str2 zu Ende
      else return (-1);                  // Str1 zu Ende
   }
   else return (1);                     // Str2 zu Ende
}

void main(void)
{
   const int elemente = 50;
   char string1[elemente];
   char string2[elemente];
   int returnwert;
   cout << "Programm zum Vergleich zweier eingegebener Zeichenketten" << endl;

   //Eingabe der Zeichenketten
   cout << "\nBitte geben Sie die erste Zeichenkette ein!" << endl;
   cout << "Bitte geben Sie max. 50 Zeichen ein: ";
   cin.getline(string1, elemente);
   cout << "\nBitte geben Sie die zweite Zeichenkette ein!" << endl;
   cout << "Bitte geben Sie max. 50 Zeichen ein: ";
   cin.getline(string2, elemente);
   cout << endl;

   returnwert = compareStr(string1, string2);

   cout << endl;
   cout << "\nResultat der Ueberpruefung der Zeichenketten:" << endl;

   //Ausgabe mit switch-case Anweisung
   switch(returnwert)
   {
      case (1):
      {
         cout << endl;
         cout << "1. Zurueckgegebener Wert ist -1" << endl;
         cout << "2. String2 ist vor String1" << endl;
         cout << "3. Zeichenkette " << string2 << " kommt im Duden vor " << string1 << endl;
         break;
      }

      case (0):
      {
         cout << endl;
         cout << "Zurueckgegebener Wert ist 0, da beide Zeichenketten gleich sind." << endl;
         break;
      }

      case (-1):
      {
         cout << endl;
         cout << "1. Zurueckgegebener Wert ist 1" << endl;
         cout << "2. String1 ist vor String2" << endl;
         cout << "3. Zeichenkette " << string1 << " kommt im Duden vor " << string2 << endl;
         break;
      }

   }
   getch();
}



Dieser Post wurde am 20.01.2005 um 18:23 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.01.2005, 16:18 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zum umwandeln von klein und grossbuchstaben brauch man keine ascii verrenkungen machen sondern kann einfach tolower bzw toupper (und zum testen isupper und islower) verwenden...

theoretisch köntnest du zum nicht casesensitiven stringvergleich auch _stricmp verwenden allerdings gehört das nicht zum ansistandard... also einfach einmal in einer schleife durchgehen und alle buchstaben auf tolower oder toupper setzen und dann strcmp aufrufen und die sache ist gegessen
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.01.2005, 18:48 Uhr
Gölti



Kann mir da bitte einer helfen und den Code verändern, dass es funktioniert?

Stehe im Moment total auf'm Schlauch und weiß keinen Rat mehr.

Vielen Dank

P.S.: Werde mich auch mal revanchieren!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.01.2005, 19:20 Uhr
Hans
Library Walker
(Operator)



Zitat von windalf:
zum umwandeln von klein und grossbuchstaben brauch man keine ascii verrenkungen machen sondern kann einfach tolower bzw toupper (und zum testen isupper und islower) verwenden...

Hi,
grundsätzlich ja, aber das funktioniert nicht mit Umlauten. Hab das Beispiel aus der OnlineHilfe mal etwas abgewandelt:

C++:
#include <stdio.h>
#include <ctype.h>

int main()
{
  char c = 'Ä';

  if (islower(c))
     printf("%c is a lowercase character\n",c);
  else printf("%c is not a lowercase character\n",c);

  return 0;
}


Anstelle des 'Ä' gibt er mir ein '-' aus, und erklärt mir, dass das kein Kleinbuchstabe ist...

In der Beschreibung (von Borland) steht zwar noch dieser aufschlussreiche Satz:

Zitat:
Das Makro ist von der aktuellen Locale-Kategorie LC_CTYPE abhängig.

Aber was es damit genau auf sich hat, weis ich bis jetzt auch nicht.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.01.2005, 20:09 Uhr
Gölti



Kann den Code nicht einfügen, dann kommen Fehlermeldungen.

Kannst du das bitte einfügen?

Vielen Dank.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.01.2005, 22:18 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


@Hans: es liegt teilweise auch daran wie man den Quellcode kodiert (also ob er mit ANSI oder OEM/Win-Zeichensatz gespeichert ist). Bei ANSI-kodierung funktioniert imho das tolower/toupper bei mir aufm VC
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
20.01.2005, 22:45 Uhr
Gölti



Bin jetzt wieder ein Stückchen weiter gekommen, allerdings passt es immer noch nicht ganz.

Wenn man z.B. Stückchen und Stück eingibt, sagt er das es gleich sei. Er sucht in dem Wort nicht mehr weiter.

Bitte nochmal um Hilfe!!! Ist dringend!!! Dürfte ja nicht mehr allzu viel sein?!?

[b]WER EINE LÖSUNG HAT DIREKT IM CODE ÄNDERN!!! DANKESCHÖN.[\b]

Weißt du eine Lösung FloSoft?


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

/*
'Ä' 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;

// Kein Umlaut? Einfach den Buchstaben übernehmen
default:
*ohneUml = *mitUml;
}

// Nächster Buchstabe
mitUml++;
ohneUml++;
}
*ohneUml=0;
}

int compareStr(char *a, char *b) {
while (*a!=0 && *b!=0) { // EDIT: nicht sicher ob das so stimmt - testen!
    if (*a==0) return -1;
    if (*b==0) return 1;
        char ca = tolower(*a); // tolower: Wandle in Kleinbuchstaben um (ignoriere also Groß/Klein beim Vergleich)
        char cb = tolower(*b);
    if (ca<cb) return 1;
    if (ca>cb) return -1;
        a++;
        b++;
}
return 0;
}

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

cout << "Eingabe Zeichenkette 1: ";
cin.getline(str1, elemente);
cout << endl;

// Umlaute wegmachen
char str1ohneUmlaute[elemente] = { 0 };
machUmlauteWeg(str1, str1ohneUmlaute);
cout << "Ohne Umlaute: " << str1ohneUmlaute << endl;

cout << "Eingabe Zeichenkette 2: ";
cin.getline(str2, elemente);
cout << endl;

// Umlaute wegmachen
char str2ohneUmlaute[elemente] = { 0 };
machUmlauteWeg(str2, str2ohneUmlaute);
cout << "Ohne Umlaute: " << str2ohneUmlaute << endl;

int ergebnis = compareStr(str1ohneUmlaute, str2ohneUmlaute);

if(ergebnis == 1)
{
cout << endl;
cout << "Wert 1" << endl;
cout << "String 1 kommt vor String 2" << endl;
}
else if(ergebnis == 0)
{
cout << endl;
cout << "Wert 0" << endl;
cout << "Uebereinstimmung String 1 und String 2" << endl;
}
else //if(ergebnis == -1)
{
cout << endl;
cout << "Wert -1" << endl;
cout << "String 2 kommt vor String 1" << endl;
}

getch();
return 1;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.01.2005, 06:47 Uhr
~Gast
Gast



C++:
int compareStr(char *a, char *b) {
while (1) { // EDIT: nicht sicher ob das so stimmt - testen!
    if(a==0 && b==0)return 0;
    if (a==0) return -1;
    if (b==0) return 1;
        char ca = tolower(*a); // tolower: Wandle in Kleinbuchstaben um (ignoriere also Groß/Klein beim Vergleich)
        char cb = tolower(*b);
    if (ca<cb) return 1;
    if (ca>cb) return -1;
        a++;
        b++;
}
return 0;
}




Sollte gehen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.01.2005, 06:52 Uhr
~Gast
Gast


Hopla! Bin noch nicht ganz wach!

C++:
int compareStr(char *a, char *b) {
if(a==0 && b==0)return 0;
if (a==0) return -1;
if (b==0) return 1;

while (1) { // EDIT: nicht sicher ob das so stimmt - testen!
    if(*a == 0 && *b == 0)return 0;
  if(*a == 0)return -1;
  if(*b == 0)return 1;

           char ca = tolower(*a); // tolower: Wandle in Kleinbuchstaben um (ignoriere also Groß/Klein beim Vergleich)
        char cb = tolower(*b);
    if (ca<cb) return 1;
    if (ca>cb) return -1;
        a++;
        b++;
}
return 0;
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.01.2005, 10:32 Uhr
Hans
Library Walker
(Operator)



Zitat von Gölti:
Wenn man z.B. Stückchen und Stück eingibt, sagt er das es gleich sei. Er sucht in dem Wort nicht mehr weiter.


Hi,
wie wäre es, wenn Du die Reihenfolge umdrehst, in der die Wörter zum vergleich übergeben werden? Und vorher die Länge der Wörter bestimmen, so das Du das längere als erstes zum Vergleich übergeben kannst, wenn das die nötige Reihenfolge ist.
Da ich nicht so genau weis, wie man das in C++ anstellt, ein verglichbares Codefragment in C. Ich hoffe, das überfordert Dich nicht

C++:
#include <string.h>

char string1="Stückchen";
char string2="Stück";

if (strlen(string1) > strlen(string2))
   strcmp (string1, string2);
else
   strcmp (string2, string1);


Dabei fällt mir gerade ein, dass strcmp() selber feststellt, ob string1 grösser ist als string2. Aber wie die Ergebnisse genau zu bewerten sind, muss man ausprobieren; - ist etwas Merkwürdig... Und wie gesagt, das ist C, kein C++!

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: