Was bedeutet das %79[^\n] in printf()?



  • In meinem Buch wird nur erwähnt, dass %79[^\n] so viel heisst wie: Gib mir alle Zeichen bis zum Zeilenende.
    Ich kann aber aber auch nur 3 Buchstaben eintippen und mit Enter bestätigen.
    In einem anderen Forum habe ich gelesen, das [^\n] heisst, dass Enter nicht gewertet wird, was bedeutet, dass ich eigendlich nicht bestätigen kann, dass ich mit der Eingabe durch bin.
    Hier der Code:

    #include <stdio.h>
    
    int main(){
    	float breite;
    	float laenge;
    	char zusatz[80];
    	int begonnen = 0;
    
    	puts("data=[");
    	while(scanf("%f,%f,%79[^\n]",&breite,&laenge,zusatz) == 3){
    		if(begonnen)
    			printf(",\n");
    		else
    			begonnen = 1;
    		printf("{latitude: %f, longitude: %f, info: '%s'}",breite,laenge,zusatz);
    	}
    
    	puts("\n]");
    	return 0;
    }
    

    Ich hoffe, dass mir das jemand leicht verständlich erklären kann.

    danke



  • "%79[^\n]" weist scanf an, von stdin alle Zeichen bis ausschließlich dem ersten Vorkommen von '\n' zu lesen, aber max. 79 Stück.
    Im Gegensatz zu "%79s" werden auch whitespaces außer '\n' gelesen und nicht beim 1. whitespace aufgehört.
    string-operationen bei scanf speichern auch immer ein abschließendes '\0' im Zielspeicher.
    scanf liest niemals '\n' aus stdin, d.h. das bleibt immer drin.
    '\n' oder EOF veranlasst scanf überhaupt erst, anzufangen.



  • Sand_am_Meer schrieb:

    Was bedeutet das %79[^\n] in printf()?

    printf ist eine komplett andere Funktion als scanf .
    Die Gemeinsamkeit ist der Formatstring, der ähnliche Bedeutung hat.

    Beim Formatspecifier [ bei scanf gibst du eine Menge (Set) von gültigen Zeichen an.
    Oder, wenn die Angabe mit ^ beginnt, die ungültigen Zeichen.

    Es werden also alle Zeichen bis zu dem '\n' eingelesen, aber maximal 79.
    Da '\n' kommt von der Entertaste. Und das bleibt noch im Eingabestrom stehen.
    (es wird zwar eingelesen, dann aber wieder zurück gestellt)

    Das spielt in der Schleife aber keine Rolle, da %f führende Whitespace (dazu gehört '\n') überliest.

    http://www.cplusplus.com/reference/cstdio/scanf/



  • Danke euch beiden.


Anmelden zum Antworten