C Eingabe der Zahlen limitieren?

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;
}

ralphdieter  07.12.2020, 17:52

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]))
1
Bartosz11  07.12.2020, 16:54

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]{};
0

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.


quuux  07.12.2020, 17:26

C ist weder veraltet, noch ungeeignet dafür!

1
DerEinsiedler  07.12.2020, 18:01
@quuux

Wenn ich mir überlege, dass ich das in C# als 1-Zeiler lösen kann, dann muss ich da leider eine andere Meinung haben :-)

0
DerEinsiedler  07.12.2020, 18:06
@quuux

Naja doch. Musst schon ganz schöne Verrenkungen machen um in C benutzerfreundliche Eingaben zu machen.

0
quuux  07.12.2020, 18:10
@DerEinsiedler

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!

0
NMI21 
Beitragsersteller
 07.12.2020, 15:59

Danke dir hat mir aber leider nicht geholfen

0