009
06.07.2003, 02:08 Uhr
Pablo
Supertux (Operator)
|
Wenn du char* hast, heißt es dass du einen Pointer über char hast (oder auch ein Array von char).
Wenn du folgendes tuts:
Code: |
char* h = "hallo"; if (h == "hallo") printf("Yeahhhhhhhhh\n"); else printf("Oh Shhhhhh.....\n);
|
ist die Ausgabe Oh Shhhh..... Das liegt daran, dass "==" nicht den Wert von h und "hallo" vergleicht, sondern die Adressen von h und "hallo", sie speichern zwar die selbe Zeichenkette aber ihre Adresse ist unterschiedlich, also liefert "==" 0 (oder false).
Du kannst strcmp benutzen, wie alle anderen schon gesagt haben, aber weiß nicht wieso, ich muss immer das Ergebnis negieren.
Code: |
char* h = "hallo"; if (!strcmp(h,"hallo")) printf("Yeahhhhhhhhh\n"); else printf("Oh Shhhhhh.....\n);
|
Die Ausgabe ist Yeahhhhhhhh.
Oder du kannst folgendes tun.
C++: |
#include <stdio.h>
int mystrcmp1(const char* str1, const char* str2) { int flag, i;
flag = 1; if (strlen(str1) != strlen(str2)) return 0; for (i=0; i<strlen(str1); i++) flag = flag & (str1[i] == str2[i]);
return flag; } // Laufzeit O(n)
//zweite Variante int mystrcmp2(const char* str1, const char* str2) { if (strlen(str1) != strlen(str2)) return 0; for (i=0; i<strlen(str1); i++) if (str1[i] != str2[i]) return 0; return 1; } // Laufzeit O(n), könnte unter Umständen sehr schneller als mystrcmp1 sein
int main() { char* a; char* b; a = "Ha"; b = "Ha"; printf("%d\n", mystrcmp1(a,b)); printf("%d\n", mystrcmp2(a, "pp")); }
|
Ausgabe : 1 0 Mir gefällt persönlich strcmp, aber ich hab schon mal dies implementiert. Von den 2 gefällt mir die 2. mehr. Die Kosten der ersten Function sind proportional zur Länge der Zeichenkette, und sie liegen in O(n), falls str1 und str2 die selbe Länge haben. Beide Arrays werden dabei unnötig komplett durchgelaufen, und in flag den Wert von str1[j]==str[j] (j, damit i nicht steht und alles in Kursiv ausgegeben wird!) gespeichert. Sollten beide Zeichenketten gleich sein, dann ist flag 1, weil flag & 0 nie auftritt. In der zweiten Funktion mache ich das selbe mit dem Unterschied, dass die Funktion 0 zurückgibt, sobald 2 Stellen von str1 und str2 unterschiedlich sind. Wenn die unterschiedliche Stelle ganz am Anfang ist, dann laufen wir die Arrays nicht bis zum Schluss, aber sollte die Fehlstelle am Schluss sein, dann ist sie äquivalent zur ersten Funktion. Man könnte sagen, mystrcmp1 liegt in \Omega(n) und mystrcmp2 liegt wirklich in O(n) -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 06.07.2003 um 02:23 Uhr von Pablo Yanez Trujillo editiert. |