suche "empty() funktion" [php] 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
-
Was du da geschrieben hast ist c. Für C++ empfehle ich std::string. (Baut auf char-Arrays auf, ist jedoch viel komfortabler zu bedienen)
Beispiel:
#include <iostream> #include <string> using namespace std; int main() { string name; do { cout << "\n Bitte Namen eingeben: "; getline(cin, name); }while(name == ""); cout << "\n Name: " << name << endl; return 0; }
//Edit: Und was mir gerade aufgefallen ist. Für die Klasse std::string ist zusätzlich zum ==-Operator noch eine Methode bool empty() definiert. Also, falls du Spaß daran hast kannst du auch statt name == "" name.empty() schreiben
Caipi
-
Hallo
grundsätzlich heißt es
if (firstperson == "")
allerdings ist dein Code in alten C-Stil, und du solltest dir die C++ Mittel wie std::string anschauen.
/Edit : Mist, zu spät
bis bald
akari
-
hehe habs so gelöst:
error = 0; do { if(error == 1) { printf("\n\nDieser Spieler-Modus existiert nicht, bitte w\x84hlen Sie [1] oder [2]!"); } 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 == (char)"");
mache ausbildung zum ITA, das andere wäre zuweit, wir sollen proggen mit den mitteln die uns im moment gegeben sind...! nur eins check ich net! die eingabe scanf funzt net.... weiß einer wieso? der überspringt das einfach!
-
scanf() ignoriert Leerraumeichen in Zeichenketten. D.h. scanf() überspringt diese Zeichen.
//Edit: Mir fällt gerade auf, dass du ja nur ein Zeichen einlesen willst? Dafür gilt obige Aussage glaub ich nicht mehr (kenne mich in C überhaupt nicht aus). Und just btw. die meisten Namen sind länger als ein Zeichen
Caipi
-
//Edit mist geschrieben
-
Dani1987 schrieb:
hehe habs so gelöst:
// [...] while(firstperson == (char)"");
Das ist ein flacher Vergleich (es werden nur die Adressen verglichen), das wid hier nicht so funktioniert wie du dir das denkst. Du brauchst einen tiefen Vergleich. Also du musst den Inhalt vergleichen, z.B. so:
while(firstperson[0] == '\0');
die Probleme hättest du in C++, wie oben gezeigt, nicht.
[edit] ups, da fällt mir nochwas auf, also du willst nur ein Zeichen und 'firstperson' ist vom Typ char? (Dachte es wäre ein char-Array) dann sieht deine Bedingung z.B. so aus:
while(firstperson == '\0');
Dein Vergleich oben ist so auch ziemlich schwachsinnig, zumal der Typecast gar nicht funktionieren dürfte, ein char-Array ist nun mal kein Zeichen bzw. ein Zeiger darauf ist kein Zeichen.
Also um so länger ich mir durchlese/angucke, was du geschrieben hast, um so weniger kapier ich es, was willst du denn überhaupt machen? Soll die Schleife so lange laufen, bis der Spieler einen Namen für seine Spielfigur eingegeben hat???
(vlt. könnte diesen Thread noch ein freundlicher Moderator ins C-Forum verschieben)
-
ich will einfach dir do while schleife nochmal durchlaufen lassen wenn nichts eingegeben wurde!
aber wieso erkennt er das scanf nicht? der überspringt das einfach
-
int main() { char str; // "str" do { printf("\n Bitte Namen eingeben: "); scanf("%c", &str); }while(str == '\n'); printf("\n Name: _%c_", str); return 0; }
//Edit
@Daniel Schuhman:while(firstperson == '\0');
Das funktioniert?
Caipi
-
Dein scanf liest genau ein Zeichen ein und es wartet auch solange, bis eins eingegeben wurde, man kann also nicht kein Zeichen eingeben, man kann höchstens eins eingeben, was du nicht als zulässige Eingabe akzeptierst.
@Caipi: dich mein ich damit natürlich nicht.
Caipi schrieb:
[cpp]
while(firstperson == '\0');
Das funktioniert?
Caipi
kommt drauf an was es machen soll ;), wenn '\0' die einzige ungültige Eingabe ist, funktioierts wahrscheinlich
-
int main() { char str; // "str" do { printf("\n Bitte Namen eingeben: "); fflush(stdin); scanf("%c", &str); }while(str == '\n'); printf("\n Name: _%c_", str); return 0; }
versuch mal so
-
ich glaube ihr versteht alle mein problem nicht:
er ÜBERSPRINGT das scanf, es kommt gar nicht erst soweit das ich was eingeben kann!
-
haste meine Version mit dem fflush(stdin) dawischen versucht?
-
probiert es einfach selber aus, es klappt net:
#include "stdafx.h" int main(int argc, char* argv[]) { int modus, error = 0; char firstperson, secondperson; printf("*********************************\n"); printf("\xB2 B\x94se 13 * Das Spiel \xB2\n\xB2 Copyright 2005 by Daniel **** \xB2"); printf("\n*********************************\n\n\n"); printf("Bitte w\x84hlen Sie den Spieler-Modus: \n\n"); printf("Einzellspieler Modus: [1]\nMultiplayer Modus: [2]"); do { if(error == 1) { printf("\n\nDieser Spieler-Modus existiert nicht, bitte w\x84hlen Sie [1] oder [2]!"); } printf("\n\nIhre Wahl: "); scanf("%d", &modus); error = 1; } while(modus > 2); switch(modus) { case 1: // Kommt noch! break; case 2: error = 0; do { if(error == 1) { printf("\n\nDieser Spieler-Modus existiert nicht, bitte w\x84hlen Sie [1] oder [2]!"); } 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(error == 1); //printf("\n\nBitte geben Sie nun den Namen der zweiten Person an: "); // scanf("%c", &secondperson); break; default: printf("\n\nDieser Spieler-Modus existiert nicht!"); break; } printf("\n\n\n\n"); return 0; }
-
Das Problem ist, wie bereits gesagt wurde, der Inputbuffer. Du liest eine Zahl ein und der Nutzer bestätigt dies mit Enter. scanf erhält die Eingabe, der Zeilenvorschub, der durch Druck von Enter ausgelöst wurde befindet sich aber noch im Inputbuffer. Beim zweiten Aufruf von scanf wird nicht mehr gewartet sondern einfach der Zeilenvorschub aus dem Inputbuffer als Eingabe genommen. Eine Lösung dafür wäre das Leeren des Eingabebuffers. Dies funktioniert zwar in manchen Fällen mit fflush(stdin); ist aber nicht standardkonform, einen Inputbuffer "nirgendwohin" zu flushen.
EDIT: Dein jetziger Code enthält übrigens eine Endlosschleife