Daniel: suche empty() funktion für c++

hi leutz, guckt euch einfach mal das hier an:

error = 0;
do
{

if(error == 1)
  {
   printf("\nKeine name!");
  }

printf("\n\nSie haben sich f\x81r den Multiplayer Modus entschieden!\n\nBitte geben Sie den Namen der ersten Person an: ");
   scanf("%c", &firstperson);

error = 1;

}
while(firstperson == '');

das ganze hier ist C++ kein php, daher gibt es keine funktion wie empty() und firstperson == '', kann ich leider nicht benutzen, da kommt nur nen fehler:

error C2137: leere Zeichenkonstante

Weiß einer von euch wie ich das in einem C++ programm sonst noch umsetzen kann?

lg dani

  1. Hallo Daniel

    das ganze hier ist C++

    Das ist eher C als C++ ...

    kein php, daher gibt es keine funktion wie empty() und firstperson == '', kann ich leider nicht benutzen, da kommt nur nen fehler:

    strlen() sollte Dir weiterhelfen.

    Weiß einer von euch wie ich das in einem C++ programm sonst noch umsetzen kann?

    Mit dem String-Typ der Standardbibliothek, std::cin, std::cout, ...

    Freundliche Grüße

    Vinzenz

    1. 你好 Vinzenz,

      kein php, daher gibt es keine funktion wie empty() und
      firstperson == '', kann ich leider nicht benutzen, da kommt nur nen
      fehler:

      strlen() sollte Dir weiterhelfen.

      Wuah, damit wuerde man gleich einen lesenden Zugriff auf Bereiche
      ausserhalb des Stacks produzieren. Mit dem scanf()-Aufruf sogar sehr
      wahrscheinlich einen schreibenden (abhaengig von der Eingabe und der
      Groesse von firstperson)...

      再见,
      克里斯蒂安

      --
      Es gibt keinen Ort, wo der Geist zu finden waere. Er ist wie die Fussspuren der Voegel am Himmel.
  2. error = 0;
    do
    {

    if(error == 1)
      {
       printf("\nKeine name!");
      }

    printf("\n\nSie haben sich f\x81r den Multiplayer Modus entschieden!\n\nBitte geben Sie den Namen der ersten Person an: ");
       scanf("%c", &firstperson);

    error = 1;

    }
    while(firstperson == '');

    das ganze hier ist C++ kein php,

    Richtig, das ganze ist C, kein C++. In C++ könntest du ganz elegant auf solche gefährlichen Konstrukte wie scanf verzichten und würdest das ganze sicher mit Streams erledigen. Außerdem brauchst du dann kein printf, sondern ebenfalls Streams.

    daher gibt es keine funktion wie empty() und firstperson == '', kann ich leider nicht benutzen, da kommt nur nen fehler:

    error C2137: leere Zeichenkonstante

    Nun, was für ein Datentyp soll den firstperson sein? Wenn das ein C-String ist, dann ist firstperson = '' schonmal Quatsch, aber ich gehe davon aus, dass du irgendwo stehen hast

    char firstperson;

    Mit der Anweisung firstperson = '' versuchst du, diesem Zeichen etwas sinnloses zuzuweisen (ein leeres Zeichen, was soll das sein?), du meinst wahrscheinlich aber eine Art Null-Wert. Deshalb probier doch

    z.B. firstperson = '\0';

    aus. Ist firstperson dagegen tatsächlich ein C-String, täte es ein simples

    firstperson = 0;

    Grüße, Robert

    1. 你好 Robert,

      [...] Ist firstperson dagegen tatsächlich ein C-String, täte es ein
      simples

      firstperson = 0;

      Nein. 0 ist nicht das gleiche und schon gar nicht dasselbe wie NULL.

      再见,
      克里斯蒂安

      --
      Willst du die Freuden dieser Welt geniessen, so musst du auch ihr Leid erdulden.
      1. 你好 Robert,

        Moin!

        [...] Ist firstperson dagegen tatsächlich ein C-String, täte es ein
        simples

        firstperson = 0;

        Nein. 0 ist nicht das gleiche und schon gar nicht dasselbe wie NULL.

        Ich merke, da kennt einer C++. Ich kenne soweit keine Architektur, die _großartig_ zwischen ((*void)0) aka NULL bzw. 0 unterscheidet. OK, das erste ist ein waschechter Pointer, während das zweite ein impliziter Cast eines int nach char* darstellt.

        再见,
        克里斯蒂安

        Yo man, Robert

        1. 你好 Robert,

          [...] Ist firstperson dagegen tatsächlich ein C-String, täte es ein
          simples

          firstperson = 0;

          Nein. 0 ist nicht das gleiche und schon gar nicht dasselbe wie NULL.

          Ich merke, da kennt einer C++.

          Eher C :)

          Ich kenne soweit keine Architektur, die _großartig_ zwischen ((*void)0)
          aka NULL bzw. 0 unterscheidet.

          Man weiss nicht, was “da draussen”[tm] fuer Compiler rumschwirren.
          Ausserdem ist es mieser Stil! :)

          再见,
          克里斯蒂安

          --
          Wenn der Schüler bereit ist, erscheint der Meister.
  3. Hi,

    das ganze hier ist C++ kein php, daher gibt es keine funktion wie empty()

    Dann bastel Dir doch eine?

    und firstperson == '',

    Die Hochkommas _müssen_ gefüllt sein, da sie schon beim Kompilieren benutzt werden. Du verwechselst das wahrscheinlich mit Anführungszeichen (""), die einen leeren String kennzeichnen.

    Weiß einer von euch wie ich das in einem C++ programm sonst noch umsetzen kann?

    Wenn man denn wüßte, was Du genau möchtest, könnte man das mit Sicherheit. (sofern überhaupt berechenbar)

    Normales Einlesen eines Strings von der Konsole:

      
    #include <iostream>  
    #include <string>  
      
    int main()  
    {  
      using std::cin;  
      using std::cout;  
      using std::string;  
      
      cout << "Bitte Namen eingeben:";  
      string firstperson;  
      std::getline(cin, firstperson);  
      cout << firstperson + "\n";  
      
      string together = firstperson + "|";  
      
      cout << "Bitte nächsten Namen eingeben:";  
      string nextperson;  
      std::getline(cin, nextperson);  
      cout << nextperson + "\n";  
      
      together = together + nextperson;  
      
      cout << together + "\n";  
      
      return 0;  
    }  
    
    

    (Diese Zeilen sind mit Bedacht so gewählt. Nur bevor jemand schreit ;-)

    In eine Schleife packen kannst Du das selber? Gut.
    Nun ist der Code allerdings etwas problematisch, wie Du mit Sicherheit festgestellt haben wirst. Erstens weißt Du jetzt immer noch nicht, wie Du aus der Schleife rauskommst, sprich: wann der Benutzer genügend Namen eingegeben hat, zweitens darf mit der Sammelmethode der Limiter '|' nicht im Namen vorkommen und drittens hast Du am Ende einen langen String der a) evt _zu_ lang ist und b) den Du am Ende auch wieder auseinanderklamüsern mußt. D'rum ein paar Hinweise.
    Für das Erste:
    Die Variabel ist nie leer, da auch ohne Namen der Benutzer die Returntaste betätigen muß um weiterzukommen. Mehr aber auch nicht! (Es geht auch anders, aber das kannst Du am Anfang getrost ignorieren. Auch gar nicht erst fragen, sonst gibt's einen etwas länglichen Vortrag über IPC und Konsorten ;-). Der Name kann ziemlich lang werden, darf er das?
    Für das Zweite:
    Naja, dürfte wohl kein Problem sein, da eine Abfrage einzubauen, ob ein '|' im eingegeben String vorkommt, oder? BTW: nicht _vorher_ darauf hinzuweisen, das ein(ige) bestimmte(s) Zeichen nicht in "Namen" vorkommen dürfen ist als Bug anzusehen und zu reparieren.
    Für das Dritte:
    In der bereits von Christian angesprochenen STL gibt es dafür geeignete Mittel, siehe z.B. http://www.mochima.com/tutorials/STL.html für Erklärungen und Beispiele eines geeigneten Bereiches.

    Immer sinnvoll natürlich die FAQ.

    so short

    Christoph Zurnieden