Einlesen von einer Datei / Strings vergleichen



  • Hallo Comunity!
    Ich bin ein ziemlicher Neuling in C und wollte fragen, warum das Programm nicht so Funktioniert wie es soll:

    /*
     * cmd_main.c
     *
     *  Created on: 15.02.2012
     *      Author: weini	-	Weinberger Michael
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    void flush();
    int main() {
    	char eingabe[1000] = "c";
    	char eingabeZwei[1000] = "c";
    	char run[4] = "run";
    	char hilfe[5] = "help";
    	char beenden[5] = "exit";
    	char ersteZeile[1000] = "c";
    	char zweiteZeile[1000] = "c";
    	char dritteZeile[1000] = "c";
    	char vierteZeile[1000] = "c";
    	char fuenfteZeile[1000] = "c";
    	char sechsteZeile[1000] = "c";
    	char siebteZeile[1000] = "c";
    	char achteZeile[1000] = "c";
    	char neunteZeile[1000] = "c";
    	char zehnteZeile[1000] = "c";
    
    	FILE *fp;
    	fp = fopen("dateipfad.txt", "r");
    	fgets(ersteZeile, 1000, fp);
    	fgets(zweiteZeile, 1000, fp);
    	fgets(dritteZeile, 1000, fp);
    	fgets(vierteZeile, 1000, fp);
    	fgets(fuenfteZeile, 1000, fp);
    	fgets(sechsteZeile, 1000, fp);
    	fgets(siebteZeile, 1000, fp);
    	fgets(achteZeile, 1000, fp);
    	fgets(neunteZeile, 1000, fp);
    	fgets(zehnteZeile, 1000, fp);
    	fclose(fp);
    
    	printf(
    			"Herzlich Wilkommen bei der Console\nSchreiben Sie <help> für Hilfe\n");
    	flush();
    	scanf("%s", eingabe);
    
    	//hilfe----------------------------------------------------------------------
    
    	if (strcmp(eingabe, hilfe) == 0) {
    		printf("\nFolgende Befehle können eingegeben werden: ");
    		printf("run\n");
    		printf("ip\n");
    		printf("ip all\n");
    		printf("exit");
    	}
    
    	//beenden--------------------------------------------------------------------
    
    	if (strcmp(eingabe, beenden) == 0) {
    		return 0;
    	}
    
    	//run------------------------------------------------------------------------
    
    	if (strcmp(eingabe, run) == 0) {
    		flush();
    		scanf("%s", eingabeZwei);
    		if(strcmp(eingabeZwei, ersteZeile) == 0) {
    			printf("Funktioniert");
    		}
    
    	}
    	printf("Falsche Eingabe");
    
    	return 0;
    }
    
    void flush(void) {
    	fflush(stdout);
    	fflush(stdin);
    }
    

    Was ist hier der Fehler?
    Wenn ich eingebe: exit, schließt es das Programm.
    Wenn ich eingebe: help, schreibt es mir die Kommandos hin.
    Wenn ich eingebe: run, kommt eine zweite eingabe.

    Wenn ich dann LoL eingebe, sollte er es mit der txt Datei vergleichen, dort steht auch in der ersten Zeile Lol und dann soll es ausgeben: Funktioniert.
    Aber es gibt mir nur Falsche Eingabe aus, warum? 😕 😕



  • Ich kann: Schleifen, Deklaration, Operatoren, ein/ausgabe, random

    mfg
    weini



  • fgets lässt das \n mit im String.
    scanf liest es hingegen nicht mit ein.

    Mach mal

    printf("<%s>\n", ersteZeile);
    

    Wenn da steht

    <LoL
    >
    

    ist der Zeilenvorschub mit drin.



  • Ich Idiot 🙂
    Danke hätte ich merken sollen, hab ja auch die ersteZeile ausgegeben und hab nicht bemerkt, das da das \n dabei ist.
    Danke 👍
    weini



  • Nur stellt sich hier die Frage, wie ich es jetzt machen kann, das es Funktioniert 😉
    Soll ich das scanf() mit einen fgets austauschen?



  • Ok, habs jetzt ausgetauscht.
    Andere Frage, kann man das auch machen, das er das \n nicht mit einliest?



  • Du kannst auch nach dem einlesen das '\n' suchen (z.B. mit strrchr()) und dann mit '\0' überschreiben.

    Und für

    char ersteZeile[1000] = "c";
    ...
        char zehnteZeile[1000] = "c";
    

    gibt es (2D-)Arrays.



  • Und bei char run[4] = "run"; kannst du die Arraygröße weglassen. Der Compiler nimmt dann die richtige Größe an:

    char run[] = "run";
    


  • Das mit den Arrays haben wir noch nicht gelernt 😉
    Ich hab zwar schon mit Java Arrays "überflogen" aber so wirklich können tue ich sie nicht und wir haben sie auch noch nicht in der Schule gelernt.



  • strrchr scheint mir nicht so richtig sinnvoll, denn die Position des Zeilenumbruchs (sofern vorhanden) im String ist ja bekannt. Wie wärs damit?

    size_t pos = strlen(ersteZeile) - 1;
    
    if(ersteZeile[pos] == '\n') { ersteZeile[pos] == '\0'; }
    


  • ?weini37? schrieb:

    void flush(void) {
    	fflush(stdout);
    	fflush(stdin);
    }
    

    Diesen Unsinn gewöhne dir am besten gleich wieder ab. (und die Quelle, aus der du sowas hast auch gleich)


Anmelden zum Antworten