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

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

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

Beitrag von Orioner » So Aug 30, 2020 9:59 am

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.)

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

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

Beitrag von mfro » So Aug 30, 2020 11:01 am

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).
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

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

Beitrag von nufan » So Aug 30, 2020 12:26 pm

Eine Alternative ist z.B. die Funktion fgets().

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

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

Beitrag von Xin » Mo Aug 31, 2020 11:22 am

...und hier noch der Hinweis auf Parameter. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

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

Beitrag von mfro » 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

Code: Alles auswählen

int main(void)
{
    ...
}
rauswillst - das ist in C (C99) durchaus erlaubt (in C++ jedoch nicht).
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

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

Beitrag von Xin » Di Sep 01, 2020 9:39 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten