Numerische Eingabe-Validierung in C
Ich mache ein Labor für eine intro-Programmierung Klasse
Ich habe, um sicherzustellen, dass eine ganze Zahl eingegeben wird. Ich dachte, dies würde es tun, aber wenn ich einen Brief wiederholt er in einer Endlosschleife.
Fand ich diese Lösung in einem anderen Beitrag
int num;
char term;
if (scanf("%d%c", &num, &term) != 2 || term != '\n')
printf("failure\n");
else
printf("valid integer followed by enter key\n");
Aber im nicht sicher, was ich falsch gemacht habe. Warum ist es nicht in meinen code?
#include <stdio.h>
int main(void)
{
int oneVar;
char term;
double numOne;
double numTwo;
double sum;
double dif;
double quo;
double mult;
int checker = 1;
do
{
printf("Please choose one of the following:\n""1) Add\n""2) Subtract\n""3) Divide\n""4) Multiply\n""5) Quit\n");
if (scanf("%d%c" , &oneVar ,&term) != 2 || term != '\n')
{
printf ("This is not valid input\n\n");
checker = 1;
}
else if (oneVar == 5)
{
printf("Thank you. Goodbye.\n");
checker = 0;
}
else if (oneVar != 1 && oneVar !=2 && oneVar != 3 && oneVar != 4)
{
printf("This is not a valid input\n\n");
checker = 1;
}
else
{
printf("Please enter the first number:\n");
if (scanf("%lf%c" , &numOne ,&term) != 2 || term != '\n')
{
printf ("This is not valid input\n\n");
checker = 1;
}
printf("Please enter the second number:\n");
if (scanf("%lf%c" , &numTwo ,&term) != 2 || term != '\n')
{
printf ("This is not valid input\n\n");
checker = 1;
}
else if (oneVar == 1)
{
sum = numOne + numTwo;
printf("The sum is: %.2lf\n" ,sum);
checker = 0;
}
else if (oneVar == 2)
{
dif = numOne - numTwo;
printf("The difference is: %.2lf\n" ,dif);
checker = 0;
}
else if (oneVar == 3)
{
quo = numOne / numTwo;
printf("The quotient is: %.2lf\n" ,quo);
checker = 0;
}
else if (oneVar == 4)
{
mult = numOne * numTwo;
printf("The product is: %.2lf\n" ,mult);
checker = 0;
}
else if (oneVar == 5)
{
printf("Thank you. Goodbye.\n");
checker = 0;
}
}
} while (checker == 1);
return(0);
}
Mein prof dies geschrieben, Im nicht sicher, wie es hilft, aber ich dachte, es könnte jemand helfen
Um sicherzustellen, dass ein Benutzer-Eingabe-Zahl ist eine ganze Zahl, die Sie verwenden können, die Vorstellung von Gießen. Gießen ist ein Weg, zu sagen, C) zur Behandlung einer Variablen als ob es eine variable eines anderen Typs.
so, wenn ich etwas wie dieses:
double myDouble;
myDouble = 5.43;
printf ("%d", (int) myDouble);
Wird es Ihnen sagen, C-print myDouble, aber um es zu behandeln wie ein integer. Nur die 5 wird gedruckt, und Sie gewann T get any type mismatch-Fehler. Sie können verwenden Sie casting, um zu sehen, wenn ein Eingabe-Zahl ist eine Ganzzahl, die durch den Vergleich der Eingabe der (int) cast der Reihe. So etwas wie dies funktionieren sollte:
if(inputNum == (int) inputNum)
Erhalten Sie immer noch 1.0 und 2.0 bestehen als gültige zahlen, aber das ist ok für jetzt.
- Hier ist noch etwas hinzuzufügen, um Ihre Ausbildung: Sie Lernen zu denken wie ein Programmierer. Zu sagen "es geht drunter und drüber" sagt uns absolut nichts darüber aus, was genau passiert. Nicht nur, herauszufinden und zu artikulieren, das Ergebnis bekommen Sie machen es viel einfacher für Menschen auf stackoverflow, um Ihnen zu helfen, aber es hilft Ihnen auch Entwickler, Ihre analytischen Fähigkeiten.
- Sind Sie auf unix-oder MS Windows? Unter MS Windows ist es nicht ganz so funktioniert, wie, dass
- Ich sagte, dass, weil ich war nicht sicher, wie Sie es beschreiben, aber im Grunde ist es nur wiederholt immer und immer wieder in einer endlos-Schleife. Ich verwende einen raspberry pi mit einem custom OS für mein Programm. Wie gesagt ich bin ein Anfänger sorry, wenn meine Sprache nicht bis zu par, aber ich Tue mein bestes! hoffentlich klärt meine Frage.
- Hey Samantha, herzlich willkommen auf StackOverflow! Vielleicht finden Sie die Frage Checkliste hier hilfreich - es wird uns helfen, besser Ihre Fragen zu beantworten und geben Ihnen die Hilfe die Sie benötigen. Viel Glück und frohes Programmieren!
- Wenn Sie gefunden, die Lösung auf StackOverflow, würde ich erwarten, dass es nach unten gestimmt.
- Ich Bemerke aus deinen anderen posts, dass du ein paar Probleme mit der Zusammenstellung und genaue syntax - meistens Tippfehler, dass der Ertrag Diagnosemeldungen verwirrend für einen Anfänger, der aber geschlossen schnell auf StackOverflow. Wenn Sie die Kodierung mit einem einfachen text-editor und Kommandozeilen-compilation auf RPi, kann ich nur empfehlen, Code::Blocks für RPi, die syntax-highlighting-editor und integrierten debugger wird Ihnen helfen, Ihre eigenen Lösungen zu diesen starter-Probleme. Seine Verfügung über den Pi Store oder von
sudo apt-get install codeblocks
. - Dank Clifford ich werde prüfen, ob aus!
- mögliche Duplikate von Überprüfen Sie, ob input ist ganze Zahl in C
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum die Dinge zu komplizieren?
In der ASCII-Tabelle, Buchstaben haben Werte zwischen 0x41 ("A") und 0x7A ("z").
Also, brauchen Sie nur den ASCII-Wert der Eingabe. 🙂
Mithilfe der
%c
zu "verbrauchen", das Ende der Zeile ist keine gute Lösung. Wenn der Benutzer sagen:123 abc<newline>
num
werden 123, aberterm
wird das Leerzeichen. Wenn Sie geben Sie einen Buchstaben anstelle einer Zahl, der Suchlauf wird stoppen, ohne dabei die Charaktere der nächsten Eingabe wird der Anruf zurück wegen der bereits gepufferte Linie, und kann immer noch verbrauchen nichts. Ihr Programm in einer Endlosschleife, weil jeder input-Anweisung nicht verbrauchen die newline und sofort zurückgegeben. Die standard-Eingabe-Funktionen warten, bis eine vollständige Zeile vor der Rücksendung, wenn die Zeile nicht vollständig Lesen, input-Funktionen brauchen nicht darauf zu warten.Gibt es eine Reihe von Lösungen, von denen viele wie die, die Sie verwendet werden, sind fehlerhaft, die Methode unten, erzwingt die Eingabe-Puffer geleert werden, bis zu und einschließlich der Zeile.
Wenn Sie die
%c
Formatbezeichner am Ende der Eingabe, dann ein etwas anderes flush ist notwendig, da die Charakter-Eingang kann ein newline: