Verwirrendes C-Programm
-
Hallo, ich bin irgendwie gerade am verzweifeln. Ich habe ein Programm zur Datumsformatierung geschrieben. Wenn ich es Compiliere und starte geht es. Wenn ich es aber mehrmals Compliere fuktioniert es nicht mehr. Also genauer gesagt, als Feldausgabe kommt eine 0 und wenn die Zeichen im Feld einzeln ausgebe, wird immer mein zuerst eingegebenes Zeichen "verschluckt". Wenn ich im Quellcode ab und zu was ändere, kann es auch passieren das es ein paar Mal wieder funktioniert, aber bei weiterer Comlilierung geht es irgendwann nicht mehr. Ich finde keinen Fehler bzw. ich seh schon nix mehr. *gg* Hab es hier zuhause und an der Uni getestet, an beiden Rechnern passiert das selbe. Vielleicht habt ihr ja ne Ahnung. Wie gesagt, ich verzweile gerade, weil es für mich überhaupt keinen Sinn ergibt. Danke im Voraus.
#include <stdlib.h> #include <stdio.h> #include <time.h> void formatieren(char*, char* ); short testen(char*, char* ); char datum[10], sysdat[8]; void main() { short i, j; do { printf("Datum eingeben: "); fflush(stdin); scanf("%s", &datum); printf("\nDatum1: %9s\n", datum); _strdate(sysdat); printf("\nDatum2: %7s\n", sysdat); formatieren(datum, sysdat); i=testen(datum, sysdat); if (i) { printf("\nFalsches Datum!"); system("cls"); } }while (i); printf("\nDatum3: %9s\n", datum); printf("\nDatum4: "); for(j=0;j<=9;j++) printf("%c", datum[j]); printf("\n"); getchar(); } void formatieren(char *datum, char *sysdat ) { short i; if (datum[1]==46) { for(i=8;i>=0;i--) { datum[i+1]=datum[i]; } datum[0]=48; } if (datum[4]==46) { for(i=8;i>=3;i--) { datum[i+1]=datum[i]; } datum[3]=48; } if (((datum[8]<48) && (datum[8]!=46)) || (datum[9]>57)) { datum[9]=datum[7]; datum[8]=datum[6]; if ((datum[0]<=sysdat[3]) && (datum[1]<=sysdat[4]) && (datum[3]<=sysdat[0]) && (datum[4]<=sysdat[1]) && (datum[8]<=sysdat[6]) && (datum[9]<=sysdat[7])) { datum[6]=50; datum[7]=48; } else { datum[6]=49; datum[7]=57; } } } short testen(char *datum, char *sysdat ) { if ((datum[0]>=sysdat[3]) && (datum[1]>sysdat[4]) && (datum[3]>=sysdat[0]) && (datum[4]>=sysdat[1]) && (datum[6]==50) && (datum[7]==48) && (datum[8]>=sysdat[6]) && (datum[9]>=sysdat[7])) return(1); if ((datum[0]>51) || ((datum[0]==51) && (datum[1]>49))) return(1); if ((datum[3]>49) || ((datum[3]==49) && (datum[4]>50))) return(1); return(0); }
PS: Testet es vielleicht 20-30 Mal bei euch. Bei meinem Rechner hier, kahm es auch erst nach dem 15 Mal oder so.
-
verwirrter user
post doch ins C Forum wenn du schon eine frage dazu hast
-
Oh Entschuldigung!!!
Bitte verschieben!!!
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Robson schrieb:
PS: Testet es vielleicht 20-30 Mal bei euch. Bei meinem Rechner hier, kahm es auch erst nach dem 15 Mal oder so.
rofl *scnr*
Zu deinem Problem, ich vermute mal, du hast wohl ein Problem mit Bufferoverflows. C-Strings sind nullterminiert, das solltest du bei Speicherreservierung und Bearbeitung beachten. Da ein Datum wie 07.12.2004 genau 10 Zeichen hat, musst du einen Puffer mit 11 Zeichen bereitstellen. 10 für den String selbst und 1 für das abschliessende Nullzeichen.
Du solltest auch keine ASCII-Codes verwenden. Mit
datum[8]<48
kann kein Schwein was anfangen.
datum[8] < '0'
Das sieht doch schon um einiges verständlicher aus.
Schon mal was vom Datentyp bool gehört? Könnte zB für deine Funktion testen() interessant sein.
Und nimm int statt short, sofern short nicht wirklich notwendig ist.