struct und strcpy

Gast #1286669
moin,
1
#include <stdio.h>
2
#include <string.h>
3

4
typedef struct {
5
  char Jahr[10];
6
  char Monat[10];
7
  char Tag[10];
8
} DATE;
9

10
DATE datum;
11

12
void check_datum(char *tmp)
13
{
14
  strcpy(datum.Monat, tmp[0]);
15
  printf("%s", datum.Monat); //Fehler
16
}
17
int main(void)
18
{
19
  char date_tmp[20] = {0};
20
  char *zeiger;
21
  printf("Bitte das aktuelle Datum im Format DD.MM.YYYY eingeben: ");
22
  scanf("%s", date_tmp);
23
  check_datum(date_tmp);
24
}
Hat hier jemand eine Idee warum sich das Programm in der markierten 
Zeile verabschiedet?
Gruß Max
Gast #1286677
dafür müssen wir wissen was du ein INPUT eingibst. Wenn du mehr als 20 
zeichen eingibst ist klar das ein Programm sich undefiniert verhählt.

Mal wieder ein schönen beispiel wie man sicherheitslücken in C programm 
ein baut!
#1286687
Wenn ich Compiler wäre, würde ich das anmeckern:
1
strcpy(datum.Monat, tmp[0]);
Vermutlich hast du einfach die Warnung ignoriert?

Denn tmp[0] ist ein char, verlangt wird aber bei strcpy() char*.
Wahrscheinlich meintest du:
1
strcpy(datum.Monat, &tmp[0]);
bzw.
1
strcpy(datum.Monat, tmp);

In deiner Form kopierst du ab der Adresse, die in dem einen
Byte tmp[0] steht (also irgendwo ganz unten im Speicher) solange,
bis eine abschließende 0 kommt. Das kann durchaus mehr
als 10 Zeichen lang sein.

Wie bereits Peter treffend sagt, fehlt es aber auch an
allen Sicherheitsmaßnahmen...
#1286705
Abgeshen davon, daß es ohnehin Unfug ist...

Der Benutzer soll etwas in der Form DD.MM.YYYY eingeben?
Das sind ja schon 10 Zeichen, zzgl abschl. 0 macht es 11.
Das wird in ein char[20] kopiert und in der Funktion dann
in ein char[10], das kann gar nicht gut gehen (von dem Fehler
mit tmp[0] abgesehen).

(Wenn das gehen würde. wäre es immer noch Quatsch, das ganze
Datum in den Monat zu kopieren, aber da kommt es dann auch
nicht mehr drauf an.I
Gast #1286754
> (Wenn das gehen würde. wäre es immer noch Quatsch, das ganze
> Datum in den Monat zu kopieren, aber da kommt es dann auch
> nicht mehr drauf an.I

Das Kuriose ist, dass es aber sogar funktionieren würde (wenn man denn 
auch später das ganze Datum wieder aus dem Monat liest). Landet das 
abschließende '\0' eben in Tag[0], wo sie von einem strcpy oder strlen 
auch wieder gefunden wird...
#1286767
In diesem Fall ja, solange der Benutzer es nicht mit der Länge 
übertreibt.
So wie das Programm aber aussieht, geht es mit der nächsten Erweiterung
wieder schief.  Ziemlich gruselig...
Vielleicht sind die Jahr[] und Tag[] ja nur drin, weil es sonst
schon vorher abstürzt?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.