Seite 1 von 1

Warum kann ich mehr als 2 Zeichen mit scanf() einlesen?

Verfasst: So Aug 30, 2020 9:59 am
von Orioner
Ich hatte gerade diesen Code hier, laufen:

Code: Alles auswählen

int main(void) {
    char test[2];
    printf("Geben Sie einen Buchstaben ein: ");
    scanf("%s", test);
    printf("Eingegeben wurde: %s\n", test);
    system("PAUSE");
    return EXIT_SUCCESS;
}
Weiß einer, warum ich in dem char-Array "test" mehr als 2 Zeichen speichern kann, wenn ich diese mit scanf() einlese? (Das Array sollte eigentlich die Anzahl der Elemente auf 2 begrenzen.)

Re: Warum kann ich mehr als 2 Zeichen mit scanf() einlesen?

Verfasst: So Aug 30, 2020 11:01 am
von mfro
Der Grund ist, daß dein Programm fehlerhaft ist (aber da bist Du in guter Gesellschaft, ein Großteil der bekannten Schwachstellen/Sicherheitslücken in Software rührt von solchen oder ganz ähnlichen Fehlern). Du kannst in einem zwei Zeichen langen Array

scanf() begrenzt die Eingabe keineswegs. Das kann es auch gar nicht. Du erinnerst dich an die kürzliche Diskussion, daß die Länge eines Arrays (das als Zeiger an Funktionen übergeben wird) in der aufgerufenen Funktion nicht bekannt ist?

Wenn Du mit einem scanf() Formatstring die Länge begrenzen willst, musst Du das selber tun:

Code: Alles auswählen

scanf("%2s", test);
(aber selbst das wäre noch verkehrt, weil auch hier über das zwei Zeichen lange Array hinausgeschrieben würde, Strings haben in C immer ein Nullbyte am Ende).

Re: Warum kann ich mehr als 2 Zeichen mit scanf() einlesen?

Verfasst: So Aug 30, 2020 12:26 pm
von nufan
Eine Alternative ist z.B. die Funktion fgets().

Re: Warum kann ich mehr als 2 Zeichen mit scanf() einlesen?

Verfasst: Mo Aug 31, 2020 11:22 am
von Xin
...und hier noch der Hinweis auf Parameter. :-)

Re: Warum kann ich mehr als 2 Zeichen mit scanf() einlesen?

Verfasst: Mo Aug 31, 2020 12:47 pm
von mfro
Xin hat geschrieben:
Mo Aug 31, 2020 11:22 am
...und hier noch der Hinweis auf Parameter. :-)
Falls Du auf das

Code: Alles auswählen

int main(void)
{
    ...
}
rauswillst - das ist in C (C99) durchaus erlaubt (in C++ jedoch nicht).

Re: Warum kann ich mehr als 2 Zeichen mit scanf() einlesen?

Verfasst: Di Sep 01, 2020 9:39 am
von Xin
mfro hat geschrieben:
Mo Aug 31, 2020 12:47 pm
Xin hat geschrieben:
Mo Aug 31, 2020 11:22 am
...und hier noch der Hinweis auf Parameter. :-)
Falls Du auf das
int main(void)
rauswillst - das ist in C (C99) durchaus erlaubt (in C++ jedoch nicht).
Nein, ich will Alternativen zu scanf anbieten, da man Parameter nicht immer wieder neu eingeben muss und fscanf einfach eine Funktion ist, die großes Potential hat, falsch zu laufen.