C Eingabe der Zahlen limitieren?
Hi, ich möchte in C die Eingabe der Zahlen limitieren. Es sollen nur Zahlen von 0-7 eingegeben werden dürfen wobei eben auch so etwas wie 123 oder 777777 eingegeben werden darf. nur nicht z.b. 18 wegen der 8. Hilfe wäre nett!
3 Antworten
- scanf("%o", &number) liest eine Oktalzahl (nach Zwischenraum) ein. Bei 64-Bit-Integern kannst Du so bis zu 21 Ziffern zwischen 0 und 7 einlesen.
- scanf(" %21[0-7]", string) liest eine Folge von bis zu 21 Ziffern zwischen 0 und 7 als String ein und schließt ihn mit '\0' ab. Das führende " " im Format überliest davor alle Zwischenraumzeichen.
Die Eingabe wird in beiden Fällen beendet, sobald ein anderes Zeichen als 0-7 kommt.
Der Standard-Systemaufruf für die Eingabezeile bietet keine Möglichkeit, falsche Zeichen bei der Eingabe zu unterdrücken. Wenn Du so etwas möchtest, musst Du Deinen eigenen Zeileneditor (einschließlich Löschen, Pfeiltasten, Copy/Paste, Historie ...) programmieren. Das ist ein Haufen Arbeit. Die (weitgehend systemunabhängige) Bibliothek ncurses bietet Dir dazu die nötigen Funktionen für Tastatur- und Bildschirmsteuerung.
Moin! Ich habe lange nicht mehr mit C gearbeitet, daher habe ich mich an DerEinsiedlers Antwort orientiert und habe bei stackoverflow gelesen, dass man sich am besten ein neues char-Array macht, in das man nur die richtigen Values reinkopiert.
Du musst dann nur aus dem Char-Array namens NewBuffer sukzessive wieder Zahlen (Integers) machen. Das wird aber funktionieren, weil ja nur gute Werte drin sind bishin zu
NewBuffer[wie_viel_kopiert-1]
.
length habe ich auf 32 gesetzt, weil mit dem Enter in die Konsole auch ein '\n' ins erste Char-Array geschrieben wird und man daher ordentlich Platz braucht.
#include <iostream>
#pragma warning(disable : 4996) //Visual Studio will scanf_s sehen. Daher Warnung deaktiviert.
#define length 32
int main(void)
{
char myCharArray[length];
int dummy;
for (int i = 0; i < length; i++)
{
do
{
dummy = scanf("%c", &myCharArray[i]);
} while (dummy == 0);
}
char newBuffer[length]; //neues Array, in das nur die „richtigen / gewollten“ Chars kopiert werden.
int j = 0;
int nlCount = 0;
int wie_viel_kopiert = 0;
for (int i = 0; i < length; i++)
{
if (myCharArray[i] == '0' || myCharArray[i] == '1' || myCharArray[i] == '2' || myCharArray[i] == '3' || myCharArray[i] == '4' || myCharArray[i] == '5' || myCharArray[i] == '6' || myCharArray[i] == '7')
{
newBuffer[j++] = myCharArray[i];
wie_viel_kopiert++;
}
else
{
nlCount++;
}
}
printf("Finished copying array without newlines. Total newlines removed: %d", nlCount);
return 0;
}
Die Eingabeschleife ist unnötig. So geht's auch:
myCharArray = scanf("%31s", myCharArray);
Und der Test auf "0-7" geht auch einfacher:
if (strchr("01234567", myCharArray[i]))
das else mit nlCount++ und das printf kannst du noch entfernen.
mach noch aus
char newBuffer[length];
lieber
char newBuffer[length]{};
genau wie
char myCharArray[length]{};
Liest die Eingabe als char-Feld ein und prüfe dann die Zeichen.
In C will man sowas aber nicht wirklich machen. C ist für sowas denkbar ungeeignet bzw. veraltet.
Wenn ich mir überlege, dass ich das in C# als 1-Zeiler lösen kann, dann muss ich da leider eine andere Meinung haben :-)
Naja doch. Musst schon ganz schöne Verrenkungen machen um in C benutzerfreundliche Eingaben zu machen.
Nur weil X mit Sprache A besser / einfacher / eleganter als mit Sprache B lösbar ist, heißt das nicht,cdass dies auch für Y und Z gilt!
C ist weder veraltet, noch ungeeignet dafür!