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.


Anmelden zum Antworten