Hilfe bei C-Programm
-
Ach so ja, was ich noch loswerden wollte, wenn du dir keine Feinde machen willst, verwende sachen wie goto möglichst gar nicht, das kann man alles in schleifen machen, weil es gibt auch befehle mit denen man quer durchs prog springen kann, und das macht dann richtig spass zum debuggen vor allem bei richtig grossen progis.
-
Hallo
Ich will ja eh gar keinen fertigen Code.
Ich bin nur unter starkem Zeitdruck, weil ich noch andere Prügungen habe.
Binh um jeden noch so kleinen Tip dankbar
Ich hab mir jetzt gedacht, das ich das mit q vielleicht über ein Extra Menü mache, das frägt, ob ich beenden will der nicht. Dann gibts halt Abzug in der Note, aber egal.Einziges Problem ist jetzt noch, warum das nicht funktioniert:
{
start:
printf ("Geben sie eine Zahl ein");
test=scanf ("%i",&zahl);
if (test ==0) goto start;
while (zahl>9) ber();
printf ("Quersumme ist %i",zahl);
goto start;
ende:
return 0;
}mit test=scanf... bekomme ich als test eine 0, wenn ein buchstabe eigegeben wird. Gebe ich ein if (test==0) goto ende, beendet er mir das Programm, wenn ich einen Buchstaben eingeben.
Geb ich aber ein goto start: weil ja wieder nach einer neuen Zahl gefragt werden soll, dann erscheint am Bildschirm unendlich oft:Geben Sie eine Zahl ein, und ich hab gar keine Möglichkeit eine Zahl einzugeben.
Ich hätt schon versucht, bevor er zurückspringt, die Zahl auf 0 oder test auf 1 zu setzten, aber ich bekomm immer eine Endlosschleife
-
mach dir mal dazwischen ein fflush(stdin) rein, aber das problem ist wie öffnest du das menü ?????? (na merkst was)
-
tut mir leid ich versteh nur Bahnhof
-
Quelle: www.pronix.de
6.2. Probleme und ihre Behandlung mit scanfEin häufiges Problem, das auftritt, wenn man scanf() für die Eingabe verwenden ist die Pufferung. Diese ist je nach System und Anwendung, Zeilen- oder Vollgepuffert. Dies gilt wiederum nicht für die Standardfehlerausgabe (stderr), die laut ANSI C, niemals vollgepuffert sein darf. Bevor ich weiter erkläre, folgendes Programm zum testen:
#include <stdio.h> int main() { char a,b,c,tmp; printf("1. Buchstabe : "); scanf("%c",&a); printf("2. Buchstabe : "); scanf("%c",&b); printf("3. Buchstabe : "); scanf("%c",&c); printf("Sie gaben ein : %c %c %c ",a,b,c); return 0; }
Was ist passiert? Warum wird der zweite Buchstabe immer übersprungen? Wie gesagt das Problem liegt hier an der Pufferung. Und C kennt nun mal keinen Befehl (wie etwa chomp bei Perl), um das letzte Zeichen zu entfernen.
In diesem Beispiel wurde als erster Buchstaben "a" eingegeben und [ENTER] gedrückt. Und dieses [ENTER] (\n = newline) befindet sich immer noch im Puffer der Standardeingabe und wird automatisch für das zweite Zeichen verwendet. Was kann man dagegen tun? Hierzu ein paar Möglichkeiten, die allerdings auch systemabhängig sind:
Möglichkeit 1
Alle 3 Buchstaben auf einmal eingeben:
include <stdio.h> int main() { char a,b,c; printf("1.2. und 3. Buchstabe : "); scanf("%c %c %c",&a,&b,&c); printf("Sie gaben ein : %c %c %c ",a,b,c); return 0; }
Möglichkeit 2
Sie benutzen die Funktion fflush() zum entleeren des Tastaturpuffers. Was aber möglicherweise nicht auf jedem Betriebssystem (speziell nicht unter Linux) so funktioniert:
#include <stdio.h> int main() { char a,b,c; printf("1. Buchstabe : "); scanf("%c",&a); fflush(stdin); printf("2. Buchstabe : "); scanf("%c",&b); fflush(stdin); printf("3. Buchstabe : "); scanf("%c",&c); printf("Sie gaben ein : %c %c %c ",a,b,c); return 0; }
Möglichkeit 3
Die wohl beste Möglichkeit. Man benutzt eine do-while-Schleife und zieht das newline-Zeichen aus dem Puffer heraus:
#include <stdio.h> int main() { char a,b,c; printf("1. Buchstabe : "); do {scanf("%c",&a);} while ( getchar() != '\n' ); printf("2. Buchstabe : "); do {scanf("%c",&b);} while ( getchar() != '\n' ); printf("3. Buchstabe : "); do {scanf("%c",&c);} while ( getchar() != '\n' ); printf("%c %c %c\n",a,b,c); return 0; }
Möglichkeit 4
Sie verwenden scanf erst gar nicht und greifen auf eine der vielen anderen Standardeingaben-Funktionen zurück. Ideal wäre es bsp. die Funktion fgets() zum Einlesen zu verwenden und die Eingabe mit der Funktion sscanf() in ein entsprechendes Format zu konvertieren.
etc etc etc...........
und das mit dem menü, dann musst do doch sowieso abrfagen ob ne bestimmte taste gedrückt wurde um es zu öffnen, dann kannst au glei nach "q" abfragen und sauber beenden, aber um gottes Willen nimm goto raus!
-
Danke das mit dem fflush(stdin) hat geholfen.
Tja da hab ich jetzt wirklich ein problem mit dem Menü
-
Hab da mal was zusammen gestellt (sorry, eigentlich sollte es nur ein kleiner Tipp werden, am Ende war's dann aber doch ein ganzes Prog. ;)):
#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> int ber(int zahl){ int quer=0; while(zahl!=0){ quer=quer+zahl%10; zahl=zahl/10; } return quer; } int main(void){ char zahl[10]; int izahl, fehler, negativ; while(1){ do{ int i; izahl=0; fehler=0; negativ=0; printf("Geben sie eine Zahl ein: "); scanf("%s", zahl); if(!strncmp(zahl, "q", 2)) return 0; for(i=0; i<strlen(zahl) && !fehler; ++i) if(!isdigit(zahl[i]) && zahl[0]!='-') fehler=1; if(!fehler) izahl=atoi(zahl); }while((izahl>-10 && izahl<10) || fehler); printf("Quersumme von %d ist: %d\n\n", izahl, ber(izahl)); } }
[ Dieser Beitrag wurde am 03.07.2003 um 22:22 Uhr von RTC editiert. ]
-
Vielen Dank
Hab selber schon ein Programm zusammengebracht, aber meins ist bei weitem nicht so gut.
Danke!!!!
-
@RTC
Hab mehrere Fragen zu deinem Prog.
Warum schreibst du das "int i;" in die Schleife ?
Müsste beim strncmp nicht "q\n" stehen, wenn du schon 2 Zeichen vergleichst ?
Und müsste in der do-while-Schleife nicht genau das umgekehrte, also
z.B. !fehler getestet werden.@Hakkinen
Was für eine Prüfung is'n das, für die du das Programm schreiben solltest.
-
Original erstellt von tiaz:
**@RTC
Hab mehrere Fragen zu deinem Prog.
Warum schreibst du das "int i;" in die Schleife ?
**Warum nicht? Es wird nur in der Schleife benötigt. Gut, man hätte es auch in main() deklarieren können, is Wurscht
Original erstellt von tiaz:
Müsste beim strncmp nicht "q\n" stehen, wenn du schon 2 Zeichen vergleichst ?Wieso? Er soll nur abbrechen, wenn NUR q eingegeben wird. Wenn ein Zeichen dahinter steht, dann nicht. Deswegen die 2 Bytes. Und wieso \n? Das wird nicht abgespeichert in dem String. Wird nur q eingegeben, so ist der String q\0, wobei letzteres als Ende des Strings ja automatisch an ihn angehängt wird, sodass man darauf nicht mit strncmp() prüfen muss...
Original erstellt von tiaz:
**Und müsste in der do-while-Schleife nicht genau das umgekehrte, also
z.B. !fehler getestet werden.
**Nein: do{...}while(... || fehler); heißt: führe das Eingeben (und Konvertieren) einer Zahl solange durch, wie ein Fehler aufgetreten ist (oder die Zahl >-10 bzw. <10 ist)