prüfen, ob Eingabe eine Zahl ist und wenn nicht zurück zum Eingang
So, ich bin neu auf dieser Seite und ich bin neu in der Programmierung. Ich bin bei meinem ersten Buch, und mein Vater gab "Hausaufgaben", er kennt Sie nicht, die codes zu tun, was diese, aber ich will es tun. Hier ist es also, was ich tun will:
Ich möchte ein Programm erstellen, wie ein Rechner, wo du geben Sie einen Wert A und Wert B und dann zeigt das Programm das Ergebnis von A + B. habe ich getan, das problem ist, dass wenn ich die Eingabe ein Zeichen das Programm hält, das Lesen der anderen codes. Hier ist, was ich geschrieben habe, vielleicht werden Sie besser verstehen.
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
void main(void)
{
int val_a;
int val_b;
int result;
printf("Write a number A=");
scanf("%d", &val_a);
if(isdigit(val_a))
{
printf("\nWrite a number B=");
scanf("%d", &val_b);
}
else
printf("\nI said number.\n");
result = val_a + val_b;
printf("%d + %d = %d", val_a, val_b, result);
getch();
printf("\033[2J"); \\ to clear the screen
}
Also, was ich will, ist, dass das Programm wird wieder kommen, wo ich über die Eingabe der Nummer A.
Ich fand bei google die Aufkleber, aber ich habe nichts verstanden :D. Vielleicht kann jemand post ein Beispiel für das, was ich will, damit ich studieren kann.
Soll ich schreiben mein name? Vielleicht beim nächsten mal 😛
PS: ich hoffe, jemand wird Sie finden ein NOOB Fehler in dem, was ich schrieb und sagen Sie es mir. :beten:
do...while
Aussage ist?Wenn Sie sagen, "Eingabe ein Zeichen" meinst du die Eingabe eines nicht-numerisches Zeichen?
Ich weiß nicht, was ein 'do...while' - Anweisung ist. Ich denke, dass es in den nächsten Lektionen in meinem Buch von C.
Können Sie das konkretisieren? Ich verstehe nicht, was du meinst.
InformationsquelleAutor George D | 2012-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kritik
So, Sie arbeiten unter Windows.
Den Rückgabetyp
main()
sollteint
, obwohl Sie finden viele Beispiele für das Gegenteil.Sollten Sie testen den Rückgabewert von
scanf()
um zu sehen, ob es in der Lage war, zu Lesen, eine Zahl oder nicht.Diese test 'funktioniert', aber es wird überprüft, ob die eingegebene Zahl ein Wert im Bereich 48..57 (ASCII, CP1252, Unicode, ISO 8859-1, etc-codes für die Ziffern
'0'
zu'9'
). Dies war wahrscheinlich nicht das, was Sie im Sinn hatte.Eingabe ein Zeilenumbruch, so dass der Zeilenumbruch vor ot die
printf()
format-string ist nicht notwendig, obwohl es auch nicht schädlich. Den gleichen Kommentar über die überprüfungscanf()
gilt auch hier.Es ist gut zu tun, Fehler überprüfen. Jedoch, Sie weiter ab auch wenn man den Fehler erkennt. Sie müssen wirklich aufhören.
Auf die ganze, am besten ist es zu Ende Zeilen mit einem Zeilenumbruch. Es spült die Daten in die Datei oder Bildschirm.
Den
printf()
format-string ist nicht tragbar. Gegeben, dass Sie enthalten<conio.h>
ist, sollten Sie wahrscheinlich verwendenclrscr()
(was wohl tut, senden Sie die escape-Sequenz oder ein äquivalent, um das terminal). Ich bin nicht davon überzeugt, dass es notwendig ist, um den Bildschirm zu löschen am Ende des Programms, aber ich arbeite hauptsächlich auf Unix-Systemen, nicht mit Windows.Gegeben, dass MSVC noch ein C89 compiler sollten Sie auch
return 0;
am Ende das Programm zurück zum Erfolg-status.Umgeschrieben
Hinzufügen alle änderungen, die Sie würde am Ende mit:
Wenn Sie gelernt haben, über Funktionen schreiben, könnte man komprimieren:
Den
get_a_number()
Funktion ist nicht eine Allgemeine Funktion, aber es ist nützlich, in diesem Zusammenhang, weil es kapselt ein gemeinsames Stück code.Das ist ein Zitat von Kernighan & Plauger, "The Elements of Programming Style".
Mit
atexit()
Den code oben wurde aktualisiert, um
getch()
undclrscr()
auf alle exit-Pfade (und zu entfernen#include <ctype.h>
da keine der Funktionen von es waren mehr). Es ist ein ärgernis zu schreiben, die die beiden Funktionsaufrufe wiederholt. Ein anderer Weg, dieses problem zu vermeiden, ist eine Funktion schreiben, die aufgerufen wird, wenn das Programm beendet; Sie registrieren es mit deratexit()
Funktion, erklärt in<stdlib.h>
:Code in
main()
davon ausgegangen, dass Sie können mix-Anweisungen (wieatexit()
) und Erklärungen (wieint val_a
) beliebig. Das ist zulässig, sowohl den aktuellen (2011) und alten (1999) - Versionen der Standard-C, aber war nicht erlaubt, die ursprüngliche (1989) version der Standard-C. ich glaube, MSVC hält sich an die ursprünglichen standard. Wenn ja, werden Sie wahrscheinlich benötigen, um zu schreiben, dassmain()
:Ist es eine feine Diskussion Stelle, ob der code im inneren block (die inneren Klammern) eingerückt werden soll eine extra-Ebene oder nicht. Sie sind immer erlaubt, um Variablen zu deklarieren, die zu Beginn eines code-block in geschweiften Klammern, so dass ermöglicht mir schreiben Sie den Aufruf
atexit()
und dann definieren Sie und verwenden Sie die Variablen.Wenn Sie Lesen, über Agile Programmierung, werden Sie feststellen, dass eines der mantras ist:
Den schreibt oben zu vermeiden, die wiederholt
getscr()
fordert, könnte als eine Anwendung des mantra. Ähnlich ist es mit derget_a_number()
Funktion; es gilt die TROCKENE mantra.Versuchen wieder
Wenn Sie möchten, dass das Programm zurück zu gehen und die Eingabeaufforderung wieder, wenn der Benutzer einen Fehler macht in Ihrer Eingabe, dann müssen Sie zum ändern der
get_a_number()
Funktion. Und, da die Funktion wächst erheblich komplexer, Sie definitiv brauchen, um mit einer Funktion für den job. Sie auch ein problem mitscanf()
; es erlaubt nicht, Sie zu erzwingen, eine Zahl pro Zeile. Wenn Sie eingegeben haben1 2
in Reaktion auf die erste Aufforderung, das erste Gespräch zuget_a_number()
Lesen würde der einen und die leere, stoppen Parsen (und die blanko-Rückseite für die Wiederverwendung) und kehrt mit dem Wert 1. Der zweite Aufrufget_a_number()
würde die Ausgabe der prompt aber wieder mit dem Wert 2, ohne das der Anwender irgendetwas eingeben mehr. Wenn nicht, Verhalten Sie wollen, dann haben Sie zu ordnen, Lesen Sie die ganze erste Zeile, und suchen Sie nach der Nummer, und dann verwerfen Sie den rest. Es ist ein weiterer Grund für sorgen zu. Wenn der Benutzer Artena
statt1
, diescanf()
wird nie gelesen, nichts mehr; Sie gehen in eine Schleife, Feststellung, dass diea
gilt nicht als eine Ziffer, 0 zurückgeben Umbauten abgeschlossen, und Ihr code wird wahrscheinlich am Ende in einer Endlosschleife, mit der Aufforderung für die Eingabe und das Lesen dera
. Diese Art von problem ist, warum viele Menschen (insbesondere mich) vermeiden Sie die Verwendungscanf()
.Der einfachste Weg, um zu vermeiden die meisten der genannten Probleme ist mit
fgets()
undsscanf()
:Dass deckt ziemlich viele Probleme. Oft ist es eine gute Idee, um echo zurück der fehlerhaften Daten. Könnten Sie das mit:
Diese verwendet "benachbarten string-Verkettung', und zeigt, was der Benutzer das Programm empfangen, die können oft helfen, den Benutzer zu verstehen, was falsch ist.
Ich verwendet
fputs(prompt, stdout)
stattprintf(prompt)
für die Ausgabe der Eingabeaufforderung. Entweder verwendet werden könnten (printf(prompt) != 0
würde der test sein), aber es gibt einen leichten Vorteil zufputs()
denn wenn jemand es geschafft, Sie zu untergraben, Ihr Programm und erhalten Sie einen%
in die Eingabeaufforderung, dieprintf()
möchte versuchen, den Prozess ein argument es nicht bestanden wurde, in der Erwägung, dassfputs()
interpretiert nicht das argument Zeichenfolge an alle. Hier, der Unterschied ist zu vernachlässigen; es kann vernünftigerweise argumentiert werden, dass ich über-verkomplizieren. Aber die Sicherheit der Programme ist auch etwas, das Sie am Ende lernen, und Techniken wie "nicht verwendenprintf(variable)
" kann dazu beitragen, dass Ihre Programme mehr belastbar. (Tatsächlich ist die Komplikation ist die Erklärung; der code ist ganz einfach.)Ein weiterer Ausführlicher Diskussion Stelle ist " sollte es einen
fflush()
nachfputs()
und vorfgets()
?' Wäre es möglich, das extra - 'Zustand'fflush(stdout) == 0 &&
zum loop control, aber in der Praxis ist es meist unnötig. Es würde nur einen Unterschied machen, wenn standard-Eingabe kam von etwas anderem, als das terminal und standard-Ausgabe geht zu Datei. Also habe ich es weggelassen.Den Zähler in der Schleife verhindert, dass die Dinge schlecht gehen schief — das Programm beendet, anstatt hängen, um für immer, vereitelt die Benutzer können nicht die Daten richtig eingegeben. Haben Sie jemals ein Programm mit einem Dialogfenster in dem Sie können nur getroffen der 'OK' - Taste (obwohl die nicht OK) und dann kommen Sie zurück mit der gleichen box wieder, immer und immer und immer wieder? Ich hoffe nicht, um deiner selbst Willen. Ich habe; es frustriert mich, wenn es passiert.
Und Sie können sehen, warum es vorteilhaft ist, den code zu schreiben in
get_a_number()
nur einmal, statt zweimal, das wäre viel Wiederholung.+1, gut geschrieben! Haben Sie Fragen, ändern Sie die "if (scanf" , "while (scanf" und entfernen Sie die "exit(1);" - Zeile.
So fanden etwas falsch mit dem Beispiel von Jonathan. Ich starte das Programm und Schreibe einen char, schließt das Programm, wenn ich es öffne wieder das Programm beginnt, indem Sie erzählt mir, ich SAGTE EINE ZAHL und dann fordert mich zur Eingabe der Nummer Ein, auch wenn ich die eingegeben (hoffe das ist das richtige Verbform --- meine Muttersprache ist Rumänisch) ein Zeichen in der Nummer B. ich bin nicht sicher, dass u got me.
Um das Programm zu warten auf Eingabe vom Benutzer zu, selbst wenn es ein problem gibt, haben Sie zu vereinbaren, rufen Sie die
getc()
Funktion (und vielleicht dieclrscr()
Funktion auch), selbst wenn es ein problem gibt. Auch, Fluchtpunkt Windows ist meist ein Problem im IDE-Umgebungen; ich neigen dazu, ein 'xterm', wie mein Fenster, und tun alle meine Entwicklung gibt, eher als in einer IDE. (Und ein Grund für die nicht-Verwendung eine IDE ist, dass die Programme, die ich nur nicht benehmen sanely, wenn von einer IDE). Ich werde aktualisieren, das Programm (so hoffe ich) verbessert die Fehler Verhalten.Ich sah, dass Sie Ihren Beitrag bearbeitet. Ich habe nichts verstanden :)) Alles was ich verstanden ist, dass ich noch mehr lernen, bis ich diese Art der Programm.
InformationsquelleAutor Jonathan Leffler
Müssen Sie prüfen, ob
scanf()
erfolgreich die Eingabe sollte es Lesen. Im Allgemeinen sollten Sie immer überprüfen, nach dem Lesen, dass das Lesen erfolgreich war.scanf()
gibt die Anzahl der erfolgreich gelesenen Eingänge, die im wesentlichen anzeigen, um die Anzahl der format-Spezifizierer ist es richtig Lesen konnte. Zum Beispiel, sollten Sie überprüfen, dassDen Wert Lesen kann oder nicht sein, eine "Ziffer". Im Allgemeinen ist es wahrscheinlich nicht eine Ziffer nach
isdigit()
da diese Funktion nur dann true zurück, für integer-Werte der Zeichen'0'
,'1'
, ...,'9'
. Testen, obscanf()
Lesen konnte, alle seine Formatbezeichner um dieses problem zu vermeiden.Wenn
scanf()
fehlschlägt, Lesen Sie ein Zeichen (mit z.B.fgetc()
) und versuchen Sie es erneut oder Lesen Sie eine ganze Zeile (nicht mitgets()
aber mitfgets()
). Vielleicht möchten Sie auch eine Nachricht drucken der Eingang war nicht das, was erwartet wurde.InformationsquelleAutor Dietmar Kühl
Hast du die
isdigit
Funktion alle falsch. Es ist dazu gedacht, um zu erhalten eine char-argument, aber in Ihrem Fall die int umgewandelt wird, herabgestuft werden Sie vielleicht sagen.Die Funktion basiert auf der ASCII-codes der Buchstaben, hier der link. Sie können versuchen, diese für sich selbst zu sehen.
Außerdem, was Sie brauchen, ist ein
do{ /* something */} while(boolean);
InformationsquelleAutor alegen
Verkennst du die Verwendung der Funktion isdigit. Es bestimmt, ob eine Charakter ist eine Ziffer, wie '0', '1', '2', etc. Jedoch, haben Sie bereits konvertiert die Eingabe in eine Ganzzahl mit der Funktion scanf. So einfach löschen Sie den Aufruf isdigit und stattdessen überprüfen Sie den Rückgabewert von scanf, die wird Ihnen sagen, wenn der Benutzer eine gültige Zahl eingegeben.
InformationsquelleAutor Carey Gregory