Zeichenketten vergleichen...

GuenniFD

Mitglied
Hallo zusammen. Erstma wünsch ich ein frohes neues Jahr....
Ich will eine Funktion basteln, die zwei Zeichenketten miteinander vergleicht, zwecks alphabetischer ordnung. Mir ist da jetzt beim testen mit folgendem code was aufgefallen:
Code:
void main (void) {
   char a, b;

   cin >> a;
   cout << (int) a << endl;
   b='ä;
   cout << (int) b << endl;
   getch();
}
Wenn ich ein ä eingebe, kommen da 2 unterschiedliche ergebnisse raus und sie sind übrigens beide negativ, wodran könnte das liegen?
Bei normalen Buchstaben a,b,c,... ist es kein problem!
Ich hoffe mir kann jemand behilflich sein.
Vielen Dank
MFG

Günni
 
Hi,
ich habe zwar nicht verstanden wo dein gegebener code was vergleicht, oder was ein negatives Ergebniss ist, aber:
Zeichen a, b, c... haben ASCII codes 0x61, 0x62, 0x63 usw
Zeichen A, B, C haben ASCII codes 0x41, 0x42, 0x43 usw
Zeichen ä, ö ,ü haben ACSII codes 0x84, 0x94, 0x81 (!)

ich hoffe das hilft
 
Hallo, das liegt daran das der Wertebereich eines
char nur bis 127 geht. Ein 'ä' hat aber den Wert 228. Also passiert ein Überlauf
vor deinem cast und es steht eine -28 in a drin, danach wird in einen int gecastet,
und der Wert -28 ausgegeben. Wenn du den Origional Wert haben willst,
verwende einen unsigned char, oder einen int...

Gruß

RedWing
 
erstmal danke für die schnellen antworten!
@RedWing:
ja ein überlauf, danke für den hinweis da hätte ich aber auch drauf kommen sollen... danke
wenn ich einen unsigned char nehm, hab ich dann alle zeichen drin, die ich vom benutzer erwarten kann?
@PixelShader:
da wird noch nix verglichen, das habe ich vor zu machen, ich habe den code nur als test benutzt!

Ich will eine funktion schreiben, die 2 Zeichenketten übergeben bekommt und es soll kontrolliert werden, ob sie in der richtigen reihenfolge sind, d.h. ob die erste alphabetisch vor der 2ten liegt oder nicht...

wie könnte ich da eurer Meinung am besten vorgehen?

vielen dank im vorraus
mfg
 
Sigmund Freud hat gesagt.:
hi,
wie bindent man den einen ASCII Code ein ?

if (a== 0x84) ?

Verstehe nicht ganz?
if(a == 'ä'), if(a == 228), if(a == 0xe4) sind alles Möglichkeiten eine Variable auf einen
Wert zu vergleichen... Der einzigste Unterschied ist wenn man schreibt 'ä', dann
weiß c++ das es sich um ein Literal mit einen Wert aus der Ascii Table handelt, und ersetzt
diesen intern mit 228 bzw 0xe4 etc...
Ausgabe routinen wie der Operator ostream& operator<<(ostream&, char), bzw
ostream& operator<<(ostream&, char*) erkennen Automatisch das sie jetzt ein Ascii Zeichen
nach stdout schreiben müssen, bei printf kann man sichs durch die Angabe eines Foramtierungsstrings aussuchen.
Also wie du siehst man kann Ascii Code nicht "einbinden" in dem Sinne, sondern es ist alles
ne Frage der Interpretation...



Ich will eine funktion schreiben, die 2 Zeichenketten übergeben bekommt und es soll kontrolliert werden, ob sie in der richtigen reihenfolge sind, d.h. ob die erste alphabetisch vor der 2ten liegt oder nicht...

wie könnte ich da eurer Meinung am besten vorgehen?

Gib der Funktion 2 Zeichenketten mit, such dir die kürzeste raus und vergleiche das ite
Zeichen des einen strings mit dem iten Zeichen des zweiten Strings in einem
Schleifendurchlauf.
Die Funktion gibt 3 Werte zurück:
-1 für erster String ist lexicographisch kleiner als zweiter string
0 für Gleichheit
1 für zweiter string ist lexicographisch kleiner als erster string

Oder so ähnlich...

Sie dir auch mal http://www.cplusplus.com/ref/cstring/strcmp.html dazu an...

wenn ich einen unsigned char nehm, hab ich dann alle zeichen drin, die ich vom benutzer erwarten kann?

Nimm halt einen int wenn du auf Nummer sicher gehen willst...

Gruß

RedWing
 
Zuletzt bearbeitet:
Danke für deine Antwort RedWing.

Habe noch ein paar Fragen...
Woher weiss ich wie lang die Zeichenkette(/n) ist(/sind)? Muss ich das mit Zeigern überprüfen, wenn dann eine \0 da ist, oder gibt es da eine extra Funktion? (Sorry, bin da noch net so fit drin)
Wie bzw. mit welchem Operator vergleiche ich die 2 Elemente aus den Zeichenketten?
Behandelt man die dann wie Zahlenwerte oder wie?

Nimm halt einen int wenn du auf Nummer sicher gehen willst...
wie meinst du das? Ich will ja erstmal einen char einlesen und nicht gleich einen int.

strcmp() ist ja eigentlich das was ich suche, aber ich würde halt gerne wissen wie man sowas programmiert..

Vielen Dank für deine Geduld!
MFG
 
Woher weiss ich wie lang die Zeichenkette(/n) ist(/sind)? Muss ich das mit Zeigern überprüfen, wenn dann eine \0 da ist, oder gibt es da eine extra Funktion? (Sorry, bin da noch net so fit drin)

Bingo, you've got it oder du verwendest strlen
Wie bzw. mit welchem Operator vergleiche ich die 2 Elemente aus den Zeichenketten?
Behandelt man die dann wie Zahlenwerte oder wie?

Nochmal Bingo ;).
Also mit < und > zum Beispiel:
Code:
if(string1[i] < string2[i]){
  //mach was
}

wie meinst du das? Ich will ja erstmal einen char einlesen und nicht gleich einen int.

In was du einliest ist egal... (Siehe vorheriger Post)
Der Unterschied macht nur der Wertebereich, aber wenn du mit char arbeiten willst, dann verbiete halt alle Zeichen, die nicht in der Ascii Tabelle vorkommen.


Sorry, bin da noch net so fit drin

Kein problem ;)

Gruß

RedWing
 
danke für die antwort!
hab noch ne frage ;-)
wie geh ich mit sonderzeichen um, wenn ich die nach einem bestimmten prinzip einordnen will?
Entsprechende ersetzen oder?
Gibt es denn den Code für strcmp irgendwo? weil im prinzip will ich ja die funktion leicht abgeändert erstellen...

danke im vorraus
 
wie geh ich mit sonderzeichen um, wenn ich die nach einem bestimmten prinzip einordnen will?
Entsprechende ersetzen oder?
Ja jenachdem was du damit machen willst...

Gibt es denn den Code für strcmp irgendwo? weil im prinzip will ich ja die funktion leicht abgeändert erstellen...

Die Implementierung is recht einfach:

Code:
#include <iostream>

using namespace std;

int my_strcmp(char* str1, char* str2){

        for(int 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;
}

int main(){

        cout << strcmp("Z", "Tes") << endl;
        cout << my_strcmp("Z", "Tes") << endl;

        cout << strcmp("Hallo", "Hallo") << endl;
        cout << my_strcmp("Hallo", "Hallo") << endl;

        cout << strcmp("Hal", "Hallo") << endl; 
        cout << my_strcmp("Hal", "Hallo") << endl;
}

Gruß

RedWing
 
Zurück