So beenden Sie ein Programm, basierend auf Benutzer-Eingabe in C
Ich bin gerade erst C zu lernen und ich habe eine problem mit dem stoppen mein Programm basiert auf dem, was der Benutzer eingegeben.
#include <stdio.h>
#include <stdbool.h>
int main()
{
int a;
int b;
char c[5];
printf("Enter the two values you like to compare, type stop to end.\n");
while (c != "stop")
{
scanf_s(" %d %d %s", &a, &b, &c);
if (!(a^b))
{
printf("both are equal\n");
getchar();
}
else
{
printf("both are not equal\n");
getchar();
}
}
printf("Thanks for playing.");
getchar();
return 0;
}
Das problem, dass ich habe ist, dass in einer anderen variable, c, in meinem scanf. Wie würde ich es tun, so dass die Benutzer nicht haben, um in einem anderen Wort, nachdem die 2 zahlen? Auch wie kann ich überprüfen, ob der Benutzer nur die Eingabe "stop", so dass es das Programm stoppen? Btw, wie ich es jetzt auch nicht, beenden Sie das Programm, wenn ich "10 10 stop". Danke.
- haben Sie versucht, mit
getch();
funtion vorreturn 0;
denken Sie daran, Sie include conio.h#include <conio.h>
- Vergleichen Sie string mit strcmp() in C, nicht
==
oder!=
. - Hinweis: Empfehlen, immer überprüfen Sie das Ergebnis der
scanf()
und Familie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Voll Funktionsfähig-Code:
while (c != "stop")
Kann man nicht vergleichen
strings
in C so, verwendenmemcmp()
oderstrncmp()
Bibliothek verfügbaren Funktionen instring.h
. Über Sie zu Lesen, um zu wissen, wie Sie umgesetzt werden können als Bedingung inwhile
Schleife.Auch, um string-input, verwenden Sie
scanf_s(" %d %d %s", &a, &b, c); //Remove that litle '&' before 'c'.
HINWEIS: Die Funktion
scanf_s
gibt die Anzahl der Eingänge korrekt gescannt werden, sollten Sie überprüfen, bevor Sie mit der Eingabe-Werte.Um Benutzer zu beenden, ohne explizit die Eingabe von "stop", viele Möglichkeiten gibt es:
1) Verwenden Sie
do-while
Schleife und immer wieder Fragen Anwender, wenn er will, mehr zu spielen.2) Verwenden Sie negative zahlen-Eingang (sagen
-1
) zu beenden.Verwenden Sie die line unten, um sicherzustellen, dass Ihre 'c' Scannen Sie Ihren string eingetragen.
Bearbeiten:
Betrachten Sie ersetzen Ihre, während Sie mit der Linie unten, um sicherzustellen, dass Sie aufhören zu arbeiten. Include "string.h"
Hier ist die gefixte version... ich habe fügen Sie Kommentare in den code, die für das Verständnis...
fgets
separat für das Scannen der Zeichenfolge.debugging the code
, versuchen. 1) Drucken Sie den Wertc
; 2) Prüfen Sie den Rückgabewert derscanf
(oderscanf_s
). 3) Versuchen Sie, die Zuordnung für "stop", die direkt aufc
während der Initialisierung.scanf(" %d %d %s",&a,&b,c)
oderscanf("%d%d%s",&a,&b,c)
bieten die gleiche Funktionalität.%d
und%s
beide verbrauchen führende whitespace-Zeichen wie" "
.Ersten, können korrigieren Sie Ihr Programm:
&c
(das Dritte argument von scanf) ist falsch. Es solltec
(denn es ist bereits ein pointer). Laut docsscanf_s
erfordert Größen angegeben werden für alle%s
format-strings; deshalb ist die Art, Sie tun jetzt Dinge, die Sie geschrieben haben sollscanf_s(" %d %d %4s", &a, &b, c);
Würde das Programm viel einfacher zu verwenden, wenn Sie verändert Ihre Logik, um "geben Sie eine leere Zeile zum beenden". Sie können dies testen, suchen, das von den return-Wert von
scanf_s
werden, welche die Anzahl der format-strings korrekt Auslesen von der Eingabe.Wenn Sie müssen zu Fragen, für Streicher, dann ermöglichen, und schauen, was der Benutzer geschrieben, um zu sehen, ob es Zahl oder string:
fgets
liest ganze Zeilen, und Sie können dann versuchen, zu analysieren, Sie mitsscanf
. Dies hat den Vorteil, über gemeinsamescanf
dass Sie versuchen, analysieren die gleiche Linie in verschiedenen Arten, je nachdem, was Sie darin finden. In der Regel werden Sie tun nicht möchten, füllen Sie Ihren code mitgetchar()
. Wenn Sie das Debuggen der debugger Stoppt für Sie. Wenn Sie nicht Debuggen, werden Sie wollen, um zu testen, oder verwenden Sie Ihr Programm mit Eingabe-Umleitung, undgetchar()
ist einfach nicht nötig.fgets()
undsscanf()
und überprüfung der Ergebnisse. BTW:fgets(c, 32, stdin)
ist OK - keine Notwendigkeit für 32-1.fgets(c, sizeof c, stdin)
ist sogar noch besser. Hinweis: angesichts der Tatsache, dass einint
könnte ein 64-bit in diesen Tagen, vielleicht eine größerec[2*21+2]
.Sein, weil Sie mit
&c
statt nurc
imscanf_s
. Ersetzen und es sollte funktionieren. Auchc
ist einstring
, so müssen Siestrcmp
statt!=
.Ein einfacher Weg, um dieser code zu schreiben wäre::