Wenn keine Eingabe
-
Hallo,
ich schreibe gerade ein einfaches Programm. Und darin soll unter anderem ein Name eingegeben werden. Wenn dies nicht der Fall ist (also keine Eingabe erfolgt, also nur Enter gedrückt wird) soll "name erforderlich" ausgegeben werden. Eben so lange bis ein name eingegeben wird.
Ich hab das so gelöst:
if(string[20] == *"") { printf("\nName erforderlich:..."); scanf("%s",&string); anzFEN=anzFEN+1; } while(string[20]== *"");
Funktioniert aber nicht ganz. Wenn ich enter drücke geht das Programm einfach in eine neue, leere Zeile.
Habt ihr irgendwelche Vorschläge?
-
um strings in c zu vergleichen musst du strcmp(); aus der string.h benutzen:
http://www.c-programmieren.com/C-Lernen.html#Das Vergleichen der Strings
wie es in c++ geht weiß ich nicht...
-
c_flo schrieb:
um strings in c zu vergleichen musst du strcmp(); aus der string.h benutzen:
http://www.c-programmieren.com/C-Lernen.html#Das Vergleichen der Strings
wie es in c++ geht weiß ich nicht...
könntest du mir auch sagen welche strings ich vergleichen soll?
-
Schau halt nach, ob
strlen()
als Ergebnis 0 liefert.Was soll eigentlich das
*""
heißen?
-
DirkB schrieb:
Was soll eigentlich das
*""
heißen?Soll wohl '\0' sein.
-
DirkB schrieb:
Was soll eigentlich das
*""
heißen?Das hat er gemacht, weil string[20] ein char ist und der Compiler gemeckert hat, dass er einen char nicht mit einem char* vergleichen kann. Und dann nach dem guten alten Programmierermotto "Wenn der Compiler meckert, zufällige Zeichen hinzufügen, bis es compiliert" ist er dann auf diese Version gekommen..
Siehe auch:
http://magazin.c-plusplus.net/artikel/(Humor) Die Entstehungsgeschichte von C
Und:
http://www.c-plusplus.net/forum/136013
-
*"" soll eigentlich leer heißen. Funktioniert aber scheinbar nicht so ganz. Mit strcpm und strlen fange ich nicht grad so viel an weil ich erst sei einem halben Jahr programmiere.
@SeppJ: Ja, ist genau so passiert.
-
Also noch mein Wissensstand:
Ich bin Anfänger und lerne seit einem halben Jahr programmieren (in der Schule). Das Problem ist nur das wir wenig leren. Das meiste schreiben wir einfach von der Tafel ab und das ist für den Lehrer lernen. Die Programmiersprache die wir lernen ist ein komplett vereinfachtes C.
-
NewC++ schrieb:
Mit strcpm und strlen fange ich nicht grad so viel an weil ich erst sei einem halben Jahr programmiere.
Ein halbes Jahr und du kennst diese Funktionen nicht? Sind das nicht so die Sachen, die man in der 3. Stunde macht?
http://www.cplusplus.com/reference/clibrary/
-
NewC++ schrieb:
@SeppJ: Ja, ist genau so passiert.
Das war nicht wirklich als Lob gedacht, falls du das so aufgefasst haben solltest. Das ist eine äußerst schlechte Programmiertechnik, wenn man nicht mehr weiter weiß, wild herum zu probieren, anstatt über das Problem nachzudenken oder mal in ein Lehrbuch zu schauen. Das klappt schon bei Ikeaschränken nicht gut, wie soll das bei einem mathematischem Logikkonstrukt wie einem Computerprogramm funktionieren? Nur weil etwas steht/compiliert und man nicht viele Schrauben übrig hat, ist es noch kein funktionsfähiger Schrank/Programm!
-
Mit welchem Compiler lernt ihr denn?
-
Also wir sind seit ca. 2 Monaten bei den Schleifen. Für die Strings hab ich mir ein Buch gekauft, weil ich Schere-Stein-Papier programmieren wollte. Als Compiler verwenden wir DevC++.
-
NewC++ schrieb:
c_flo schrieb:
um strings in c zu vergleichen musst du strcmp(); aus der string.h benutzen:
http://www.c-programmieren.com/C-Lernen.html#Das Vergleichen der Strings
wie es in c++ geht weiß ich nicht...
könntest du mir auch sagen welche strings ich vergleichen soll?
-ja,dies ist ein vergleich: string[20] == ""
-
Im Prinzip müsstest du festlegen was für dich ein Name ist bzw. wie kurz der kürzeste Name eigentlich ist. Was ich grad im Kopf hab ist wohl die mind. Länge eines Namens um die 3 Zeichen lang (Jan als Beispiel), folglich müsste die Zeichenfolge die du einliest eine mind. Länge von 3 Zeichen + \0 haben, folglich 4 elemente des Arrays sind besetzt
char name[20]; do { printf("Geben Sie Ihren Namen ein: "); scanf("%s", name); }while(strlen(name) < 3);
Ob der Name dann sinnvoll ist kannst du so ohne großen Aufwand eigentlich nicht überprüfen. Sobald du 3 Zeichen eingelesen hast, ist es als Name aktzeptiert
Und was die Ausbildung betrifft:
Die Klassen unter mir, die dieses Jahr mit der Schule angefangen haben, haben im Gegensatz zu uns anstatt mit C direkt mit einem Programm namens Hamster Light (oder wie auch immer) angefangen. Dabei haben sie zwar spielerisch Programmieren kennen gelernt, jedoch von Können riech ich in deren Klassen nichts, eher das Gegenteil. Jetzt, kurz vor dem Ende des 1. Semester haben sie mit "C" angefangen... Genau gesehen programmieren die Schüler bereits seit bald einem halben Jahr, können aber so viel wie Schüler die gerade mal die 3. Stunde Programmieren hinter sich hatten.
Und von was kommt das? Von dem neuen Schulsystem das eingeführt wurde (Kompetenz bereiche, jeder Teilbereich einer Kompetenz und deren Gesamtkompetenz der 2 Kompetenzbereiche muss Positiv sein)... Ein neuer Lehrplan mit Zentralmatura ohne einheitlichen und Zeitgemäßen Lehrmittel für diesen. Diese Zentralmatura wird ein reiner reinfalll -.-
B2T: Mit strcmp könntest du ebenfalls vergleichen, jedoch ist es für dieses Beispiel ungeschickt (meines Erachtens)
-
itedvo schrieb:
char name[20]; do { printf("Geben Sie Ihren Namen ein: "); scanf("%s", name); }while(strlen(name) < 3);
Ob der Name dann sinnvoll ist kannst du so ohne großen Aufwand eigentlich nicht überprüfen. Sobald du 3 Zeichen eingelesen hast, ist es als Name aktzeptiert
Ich habs mit dem Code probiert. Aber es kommt wieder eine leer Zeile wenn ich einfach enter drücke.
itedvo schrieb:
Und was die Ausbildung betrifft:
Die Klassen unter mir, die dieses Jahr mit der Schule angefangen haben, haben im Gegensatz zu uns anstatt mit C direkt mit einem Programm namens Hamster Light (oder wie auch immer) angefangen. Dabei haben sie zwar spielerisch Programmieren kennen gelernt, jedoch von Können riech ich in deren Klassen nichts, eher das Gegenteil. Jetzt, kurz vor dem Ende des 1. Semester haben sie mit "C" angefangen... Genau gesehen programmieren die Schüler bereits seit bald einem halben Jahr, können aber so viel wie Schüler die gerade mal die 3. Stunde Programmieren hinter sich hatten.
Und von was kommt das? Von dem neuen Schulsystem das eingeführt wurde (Kompetenz bereiche, jeder Teilbereich einer Kompetenz und deren Gesamtkompetenz der 2 Kompetenzbereiche muss Positiv sein)... Ein neuer Lehrplan mit Zentralmatura ohne einheitlichen und Zeitgemäßen Lehrmittel für diesen. Diese Zentralmatura wird ein reiner reinfalll -.-
B2T: Mit strcmp könntest du ebenfalls vergleichen, jedoch ist es für dieses Beispiel ungeschickt (meines Erachtens)
Ich glaube eher das es bei uns am Lehrer liegt. Denn der kommt immer eine halbe Stunde zu spät und bei 2 Stunden programmieren in der Woche ist das recht viel.
-
NewC++ schrieb:
Hallo,
ich schreibe gerade ein einfaches Programm. Und darin soll unter anderem ein Name eingegeben werden. Wenn dies nicht der Fall ist (also keine Eingabe erfolgt, also nur Enter gedrückt wird) soll "name erforderlich" ausgegeben werden. Eben so lange bis ein name eingegeben wird.
if(string[20] == *"") { printf("\nName erforderlich:..."); scanf("%s",&string); anzFEN=anzFEN+1; } while(string[20]== *"");
Versuche mal zu begreifen, dass man solcherlei Aufgabenstellungen in C durch Einsatz von Funktionen löst, wenn es keine "passende" Standardfunktion gibt, dann schreibe dir deine eigenen.
Du kapselst also deine Probleme in eigenständige Funktionen mit definierten Schnittstellen, das erhöht die Übersichtlichkeit des Gesamtprogramms und erleichtert die Fehlersuche und Testfälle.z.B.
enum {FEHLER,ERFOLG}; char name[100]; printf("\nName erforderlich:..."); while( liesString(name)==FEHLER ) /* liesString schreibst du dir selbst */ { printf("fehlerhafte Eingabe"); printf("\nName erforderlich:..."); } ... printf("eingegebener Name: %s",name); ... int liesString(char *s) { s[0]='\0'; scanf("%99[^\n]",s); while( getchar()!='\n' ); return s[0]!='\0'?ERFOLG:FEHLER; }
-
Akzeptiere das erst einfach mal mit dem 'Enter' und der neuen Zeile.
Wenn du das in den Griff bekommen willst, wird der Quelltext nur deshalb deutlich umfangreicher. Und das nur wegen der OptikWenn dein anderer Quelltext sauber läuft, kannst du dich immer noch daran versuchen
MfG f.-th.
-
Ich hätte ja das hier vorgeschlagen, die Frage ist, ob das hilft, nach der "wir sind seit zwei Monaten bei Schleifen" Aussage.
int is_name(const char* name) { return 0; } char* get_name(char* buf, size_t size) { do printf("Enter your name: "); while (!is_name(fgets(buf, size, stdin))); return buf; } int main(void) { char buf[100]; printf("Hello, %s!", get_name(buf, sizeof(buf))); return 0; }
-
Also ich hab das mit der leeren Eingabe mal weggelassen.
int anzFE,anzAG,anzZE,anzFEN,maxZ,minZ,zeit; anzFE=0,anzAG=0;anzFEN=0,minZ=0,maxZ=0; char name[20]; char nameMin[20]; char nameMax[20]; char string[20]; char string1[20]; zeit==0; do { anzZE=anzZE+1; printf("Geben Sie Ihren Namen ein:..."); scanf("%s", name); printf("\nGeben Sie Ihre Zeit ein:..."); scanf("%d",&zeit); if(zeit==0) { printf("\nAusgeschieden"); anzAG=anzAG+1; } else { if(zeit<minZ) { minZ=zeit; nameMin==name; } else { if(zeit>maxZ) { maxZ=zeit; nameMax==name; } } } } while(zeit>=0); printf("\n%d\n%s\n%d\n%s\n%d",anzAG,nameMin,minZ,nameMax,maxZ);
Steh aber schon vor dem nächsten Problem. Alles läuft Problemlos nur am Ende gibt das Programm irgendwelche Zeichen aus.
-
Womit kompiliert das?