Laufzeitfehler bei einfachem C-Programm...



  • Hi Leute,
    ich hab heute Heute nacht aus Langeweile mal ein Programm geschrieben und wollte jetzt endlich mal ins Bett gehen. Ich kann nich mehr überlegen und wollte deshalb hier mal fragen wieso denn das folgende Programm ein Laufzeitfehler hat.
    Also die while-Schleife führt er Perfekt aus alles läuft nach Plan auch wenn ich 0 eingebe und ENTER drücke bricht er mit der Funktion break; die Schleife ab und müsste eigentlich den String entgegennehmen das tut er aber nicht und springt einfach bis zu nächsten printf()-Anweisung. Will aber das man noch den Integer-Wert eingibt. Also ich versteh das nich.
    Freu mich schon das ich wieder was dazu lernen kann auch wenn es nur ein kleiner dummer Fehler ist.

    #include <iostream.h>
    #include <stdio.h>
    
    int main() {
    	int i;
    	int n;
    	int u = 0;
    	char String[100];
    	int a;
    	int b;
    
    	while(u == 0) {
    
    		printf("Mit 0 beenden!\n");
    		printf("Wie oft soll ich Neue Tastatur ausgeben?\n");
    		scanf("%d", &n);
    
    		if(n == 0) {
    			break;
    		}
    
    		for(i = 0; i < n; ++i)
    		{
    			printf("\t\tNeue Tastatur!\n");
    		}
    	}
    
    	printf("Ein kleines Extra: ");
    	printf("Du kannst jetzt etwas schreiben und dir dann\n"
    		   "aussuchen wie oft du diesen Satzt ausgeben willst!\n");
    	printf("Also welchen Satzt moechtest du denn ausgeben?\n");
    
    	fgets(String, sizeof(String), stdin);
    	sscanf("%s", String);
    
    	printf("Und wie oft willst du diesen Satzt ausgeben?\n");
    	scanf("%d", &a);
    
    	for(b = 0; b < a; ++b) 
    	{
    		printf("%s\n", String);
    	}
    
    	printf("Danke das du Cl0v3rware benutzt hast!\n");
    
    	return 0;
    }
    

    Danke shcon mal im voraus.
    Bisch dann
    Cl0v3r



  • scanf("%s", String); //statt sscanf
    

    http://www.cppreference.com/stdio/sscanf.html



  • Hi,
    ja danke hat geklappt aber wieso ist das denn so?
    Und dann noch eine kleine Frage: Wenn ich dann einen Satzt eingebe den ich dann ausgeben will und da ein Leerzeichen drin ist überspringt er die nächste scanf()-Anweisung einfach, gibt alle printf()-Anweisungen noch aus aber dann geht er einfach schnur stracks zum Ende des Programms...
    Ist das so weil er ein Leerzeichen also 0 interpretiert und deshalb die Antwort zu der Frage wie oft man den Satzt denn ausgeben möchte schon hat?

    Danke schön für die Hilfe...
    Bisch dann
    Cl0v3r

    P.S.: Sorry @ Admin und Moderatoren:
    bin neu hier und hab das Forum
    ANSI C übersehen! 🙄
    wenn ihr den Thread bitte ver-
    schieben könntet? Danke und
    nochmal sorry.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • alle scanf varianten brechen ein %s beim ersten leerzeichen ab. ist so.

    sscanf() liest aus einem string
    scanf() liest von stdin



  • while(u == 0) {

    also irgendwie ist das ne Endlosschleife.

    €dit: Hoppla, habe das break nicht gesehen, sorry.
    Tipp: verwende gleich while(1), dann brauchst du keine extra Variable.



  • Cool danke habe ich wieder was gelernt. 🕶
    Könnte mir noch einer sagen wie ich das Problem in den Griff kriege? (Der sollte ein Leerzeichen auch als "char" sehen oder besser noch er sollte Leerzeichen einfach so behandeln wie normale Buchstaben bzw. er soll alles als einen String abspeichern und nicht einfach bei einem Leerzeichen abbrechen.)

    Danke
    Cl0v3r



  • hallo mit diesen beiden funktionen anstatt scanf werden Leerzeichen zwischen den Wörtern normal mit eingelesen. Nur führende Leerzeichen werden überlesen. das mit dem scanf und dem überspringen hört sich für mich an wie ein Tastaturpufferproblem. Da ist irgendwas noch im Tataturpuffer. Ich würde vor dem Aufruf wo das passiert fflush(stdin) aufrufen. Das leert den Tastaturpuffer.

    fgets(String, sizeof(String), stdin);
    sscanf("%s", String);

    wobei ich das nicht verstehe. Du liest erst von der Tastatur mit fgets einen String ein und gleich danach nochmal mit scanf wider von der Tastatur 😕

    IST DAS WIRKLICH SO GEWOLLT?

    cu



  • alle scanf() scannen nur bis das muster erfüllt ist. also wenn du %d scannst und "123asd" eingibst, dann bleibt "asd" im puffer, weil es nicht gescannt werden konnte.

    nimm fgets() mit stdin als datei, damit bist du das problem los



  • Hi,
    JUCHUUUU danke @ all hat geklappt mit dem fflush() und dann erst fgets() @Lazarus und c.rackwitz, dickes danke nochmal.

    Ich habe das mit fgets() so verstanden das man mit der Funktion Speicher reserviert und dann in den reservierten Speicher mit scanf() reinschreibt. 🙄 Manno man endlich funktioniert das Programm so wie ich das will *freu* :p 😃

    Okay thx@all nocmal.
    Bis dann
    Cl0v3r


Log in to reply