Längste Zeile eines Textes ausgeben



  • hallo,
    wir sollen die längste zeile eines textes ausgeben. ich hab folgenden ansatz:

    #include<stdio.h>
    
    int main() {
    
    	int c;
    	int zeichen = 0;
    	int zeichenmax = 0;
    	int zeile = 0;
    	int zeilemax = 0;
    
    	while ( (c=getchar()) != EOF) {
    		++zeichen;
    		if (c == '\n') {
    			++zeile;
    			if (zeichenmax<zeichen) {
    				zeichenmax = zeichen;
    				zeilemax = zeile;
    				zeichen = 0;
    			}
    			else zeichen = 0;
    		}
    	}
    	printf("Die laengste Zeile ist: %d mit %d Zeichen.\n", zeilemax, zeichenmax);
    
    	rewind(stdin);
    	zeile = 0;
    
    	while ( (c=getchar()) != EOF) {
    		if (c=='\n') ++zeile;
    		if (zeile == zeilemax) putchar(c);
    	}
    	return 0;
    }
    

    Dummerweise gibt der mir nicht die längste zeile aus, sondern nur die nummer von der längsten zeile. Was ist da falsch?
    mfg



  • Naja um eine Zeile auslesen und ausgeben zu wollen müsstest du überhaupt erstmal einen String deklarieren, in dem die Zeichenholge gespeichert werden soll.

    Sowie ich das sehe willst du das ganze zeichenweise machen. Dann müsstest du ein Zeichen deklarieren. Ein Zeichen gibt jedoch nicht eine ganze Zeile aus, sondern eben nur ein Zeichen also: --> String deklarieren

    Und was ist bitte ++zeichen; oder ++zeile;...?

    Und naja, du beschwerst dich darüber, dass deine Zeile nicht ausgegeben wird sondern die Nummer und hast den Foratspecifier für eine integer Zahl (der in dem Fall sogar korrekt ist, da du %d nach dem Komma bei printf() eine integer-Zahl zuweist)



  • Das rewind hat bei stdin wenig Zweck.
    Was soll da passieren?
    Wenn du ein Datei ausliest, funktioniert das.

    Aber du hast da noch eine Diskrepanz bei den Zeilennummern zwischen der Ermittlung und Ausgabe der Zeile.



  • TocToc schrieb:

    Naja um eine Zeile auslesen und ausgeben zu wollen müsstest du überhaupt erstmal einen String deklarieren, in dem die Zeichenholge gespeichert werden soll.

    Sowie ich das sehe willst du das ganze zeichenweise machen. Dann müsstest du ein Zeichen deklarieren. Ein Zeichen gibt jedoch nicht eine ganze Zeile aus, sondern eben nur ein Zeichen also: --> String deklarieren

    Und was ist bitte ++zeichen; oder ++zeile;...?

    Und naja, du beschwerst dich darüber, dass deine Zeile nicht ausgegeben wird sondern die Nummer und hast den Foratspecifier für eine integer Zahl (der in dem Fall sogar korrekt ist, da du %d nach dem Komma bei printf() eine integer-Zahl zuweist)

    In int c werden ja die zeichen gespeichert.

    ++zeichen und ++zeile ist dafür da um die zeile zu finden, in der die meisten zeichen sind. Um die längste zeile ausgeben zu wollen, muss ich logischerweise ja erstmal wissen wo diese zeile überhaupt ist.

    DirkB schrieb:

    Das rewind hat bei stdin wenig Zweck.
    Was soll da passieren?
    Wenn du ein Datei ausliest, funktioniert das.

    Aber du hast da noch eine Diskrepanz bei den Zeilennummern zwischen der Ermittlung und Ausgabe der Zeile.

    das rewind(stdin) ist dafür da, das er die datei von vorne nochmal durchgeht. Erst hab ich ja die maximale zeile bestimmt, dann ist das programm am dateiende (->EOF). Wenn ich nun die maximale zeile ausgeben will (und nicht nur die nummer bestimmen will wo sie ist), muss die datei ja nochmal gelesen werden.

    Ich hab es mittlerweile zum laufen gebracht, und zwar musste ich nach dem rewind(stdin) zeile auf 1 setzen (ich hab dort zeile = 0 stehen).



  • kenplan schrieb:

    Ich versteh zwar noch nicht ganz warum, aber es funktioniert (auch wenn die längste zeile die erste zeile ist, das macht für mich aber irgendwie keinen sinn).

    Das hängt damit zusammen, wann du zeile++; machst.
    Beim Ermitteln der Länge erhöst du zeile nach dem '\n'. Dadurch bekommt die erste Zeile die 1.

    Beim Ausgeben hat bei dir die erste Zeile die 0



  • Ja das stimmt. Danke.


Anmelden zum Antworten