Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » if und char*

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 ] [ 3 ] [ 4 ]
000
05.07.2003, 10:47 Uhr
~Peter
Gast


Wie werden if-Abfragen auf ein char* durchgeführt.

Bei einem std::string geht es ja folgendermaßen:

if (keyword == "Hallo") //keyword = std::string
{
//...
}


Wenn ich aber ein char* ckey habe, wie läuft es da?

Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.07.2003, 11:52 Uhr
Alois




C++:
#include <string.h>

if(strcmp(ckey, "Hallo") == 0)
{
    // ...
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.07.2003, 12:38 Uhr
~Peter
Gast


Und wie sieht das ganze aus, wenn ich bspw. folgendes mit char* ckey machen möchte:

std::string-Beispiel:

Code:
if (keyword == "Hallo" || keyword == "Peter" || keyword = "Taucher" || ...)
{

}


Wie müßte ich das bei char* ckey umsetzen?
Damit komme ich noch nicht so richtig klar!

Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.07.2003, 13:03 Uhr
Alois



Da nimmst du auch die Funktion strcmp. Die liefert 0 zurück, wenn beide Strings gleich waren, 1, wenn der erste (alphabetisch sortiert) später kommt, und -1, wenn der zweite später kommt.

C++:
if(strcmp(ckey, "Hallo") == 0 || strcmp(ckey, "Peter") == 0 || ...)
{
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.07.2003, 13:13 Uhr
~Peter
Gast


Danke für die Antwort!

Aber ich muß folgendes noch anmerken:

Wenn ich nun eine if-Abfrage aufbaue und wenn ca. 70 Oder-Verknüpfungen notwendig sind, ist es dann noch guter Programmier-Stil, wenn ich meine if-Abfragen auf char* ckey, so aufbaue? Oder gibt es eine elegantere Lösung?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.07.2003, 14:11 Uhr
Alois



Dann würde ich einen Array machen, in dem alle Passwörter stehen, und ckey mit jedem Element vergleichen:


C++:
char passwords[][] = { "Hallo", "Peter", "Taucher", ... }
int   i, AnzahlDerPasswoerter = 70;

for(i=0; i<AnzahlDerPasswoerter; i++)
     if(strcmp(ckey, passwords[i]) == 0)
     {
         // ...
         break;
     }


Dieser Post wurde am 05.07.2003 um 14:57 Uhr von Alois editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
05.07.2003, 15:03 Uhr
~Peter
Gast


Hallo Alois!

Vielen Dank! Habe viel gelernt heute!

Gruß
Peter
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.07.2003, 21:09 Uhr
~0xdeadbeef
Gast


Wenn du C++ benutzt, würd ich da auf set zurückgreifen:

C++:
#include <string>
#include <iostream>
#include <algorithm>
#include <set>

std::string _pw_init[] = { "Test1", "Test2", "bla" };
std::set<std::string> passwords(_pw_init, _pw_init + 3);

int main() {
    std::string s;

    std::cin >> s;

    if(pws.find(s) != pws.end())
        std::cout << "Jepp, ist drin" << std::endl;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
05.07.2003, 22:28 Uhr
~Peter
Gast


Bei Deinem Bsp. handelt es sich allerdings um ein std::string. Ich wollte bei meinem char* bleiben. Eine Konvertierung von char* nach std::string käme bei mir leider nicht in Frage.

Dennoch danke für die Antwort!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ]     [ 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: