Visual Studio ignoriert if-Abfrage?
-
Hi Jungs,
erstmal großes Lob an die Leute die hier mithelfen.Nun zu meiner Frage, undzwar hatte ich vor, ein Programm zu schreiben welches Namen aus einer Datei ausliest, diese auf fehlerhafte Zeichen kontrolliert, in einer Linked-List speichert, sortiert und dann in eine Ausgabedatei schreibt.
Ich hänge nun leider bei der Abfrage nach ungewollten Zeichen. In jeder Line der Input-Datei sollen nämlich nur Buchstaben von a-z, A-Z, Umlaute und Leerzeichen erlaubt sein. Füge ich nun absichtlich in der 2. Line einige Sonderzeichen hinzu, so läuft Visual Studio trotzdem die ganze Abfrage durch. Starte ich das Programm jedoch über die CMD so bricht es wie gewollt in der 2. Line aufgrund der If-Abfrage ab. So, genug geredet, hier der Code.#include <stdio.h> #include <string.h> #include <stdlib.h> #define NAME_LEN 256 #define DATA_LEN 128 struct database { //Struktur für die Namelist int id; //diese wird aus der Datei unsigned char name[NAME_LEN]; //gelesen und mittels Linked struct database *next; //List verknüpft. }; FILE *fopen(const char *filename, const char *mode); int main(int argc, char *argv[]) { char input[DATA_LEN], output[DATA_LEN], line[NAME_LEN]; int i, add = 0; struct database *namelist = NULL; //Pointer zeigt auf NULL FILE *fp; //-----------------------Argumente werden Überprüft------------------------- if(argc > 4 || argc < 3) { printf("sortnames: wrong number of input or output files\n"); system("PAUSE"); return 1; } if(argc >= 3 && argc <= 4){ if(0 == strcmp(argv[1],"-r")){ add = 1; } } //----------------Filepointer wird auf input Datei gelegt----------------- if((fp=fopen(argv[1+add], "r"))==NULL) { printf("sortnames: cannot open input file: %s\n", argv[1+add]); system("PAUSE"); return 1; } else { while(fgets(line, 255, fp) != NULL) //Die erste Line wird aus der Datei importiert { for(i=0; line[i]!='\n'; i++) //Jeder Buchstabe der ersten Line wird kontrolliert { if( (line[i]>='a' && line[i]<='z') || (line[i]>='A' && line[i]<='Z') || (line[i] == '.') || (line[i] == ' ') || (line[i] == '-') || (line[i] == 'ä') || (line[i] == 'ö') || (line[i] == 'ü') || (line[i] == 'Ä') || (line[i] == 'Ü') || (line[i] == 'Ö') ) { // Hier beginnt die if-Anweisung printf("%c", line[i]); }else { printf("sortnames: wrong input format\n"); system("PAUSE"); return 1; } } } } system("PAUSE"); }
Und hier der Inhalt der input.txt:
Franz Kranz%§"%$§!$§".-- -. -1 Dank Blan Tretr Gagaui Babar
Ich hab mittlerweile echt keine Ahnung woran das liegen könnte, weiss jemand von euch vllt. bescheid?
Danke schonmal
-
Wie wäre es mit der Funktion "isalpha" aus ctype.h?
http://www.cplusplus.com/reference/clibrary/cctype/
-
FILE *fopen(const char *filename, const char *mode);
Ganz schlecht.
Hier deklarierst du die eine Standardbibliotheksfunktion neu. Das passiert schon in den Standard-Header-Dateien, und dort immer fehlerfrei.Zeichen aus dem erweiterten ASCII Satz zu verwenden ist auch schlecht.
Damit ziehst du nur unnötige Abhängigkeiten zw. dem Encoding deines Editors und der Laufzeitumgebung an.#include <locale.h> // setlocale ... setlocale(LC_ALL, "German"); ... while(fgets(line, sizeof line, fp) != NULL) //Die erste Line wird aus der Datei importiert { for(i=0; line[i] && line[i]!='\n'; i++) //Jeder Buchstabe der ersten Line wird kontrolliert { if( isalpha(line[i]) || strchr(" .-",line[i]) )
-
Wutz schrieb:
Zeichen aus dem erweiterten ASCII Satz zu verwenden ist auch schlecht.
Damit ziehst du nur unnötige Abhängigkeiten zw. dem Encoding deines Editors und der Laufzeitumgebung an.Ich muss gestehen das ich nicht wusste, dass mit Hilfe von setlocale Umlaute als normale Zeichen erkannt werden. Genauergesagt wusste ich garnicht das es setlocale gibt.
Wie ich auf die Idee kommen konnte File *fopen neu zu deklarieren weiss ich noch immer nicht. Ich denke ich muss irgendwie zwischen dem lernen der Uniunterlagen und dem Durchsuchen der C-Referenzen durcheinander gekommen sein.
Vielen Dank euch.