scanf 2mal auf gleiche stdin anwenden?



  • Hallo,

    Ich nutze eclipse mit MinGW unter Vista x64.

    Leider habe ich folgendes Problem:
    wenn ich die eingabe (stdin) mit scanf einlese, ist es nicht mehr
    möglich ein zweites scanf auf die gleiche eingabe anzuwenden sondern
    man muss erst wieder etwas eingegeben.
    Scheinbar wird also stdin durch scanf geleert.
    (Ich hab auch schon fflush(stdin) an allen möglichen Stellen
    im Code eingebaut ohne dass es hilft)

    int main()
    {
    setbuf(stdout,NULL);
    int x,y;

    printf("Eingabe:");
    scanf("%i",&x);
    scanf("%i",&y);
    printf("%i",x);
    printf("%i",y);

    return 0;
    }

    insgesamt sollen die 2 scanf() befehle auf 2 funktionen verteilt werden:
    ich kenn zwar die lösung mit fgets und dann sscanf,
    muss aber mit scanf einlesen da die variable von fgets
    nicht an die zweite funktion weitergegeben werden kann
    (bitte korrigiert mich wenn es doch geht)

    int main()
    {
    setbuf(stdout,NULL);
    int i;

    do
    {
    printf("Eingabe");
    }
    while(is_int(stdin)==0);

    //Hier wird die Eingabe noch einmal benötig
    //weil stdin schon durch das scanf aus is_int() "verbraucht" wurde

    scanf("%i",&i);
    printf("%i",i);

    return 0;
    }

    char is_int()
    {
    char check,c;

    fflush(stdin);
    check=scanf("%*i%c",&c);

    if (check!=0 && c=='\n')
    {return 1;}
    else
    {return 0;}
    }

    mfg Christoph



  • warum ließt du mit dem scanf nicht einen string ein, den du dann beliebig oft bearbeiten kannst (mit sscanf);



  • Hallo,

    Wie bereits erwähnt muss scanf bzw. fgets+sscanf in 2 Funktionen (main und is_int) mit nur einer eingabe erfolgen. Wenn ich also stdin in einen string einlese, steht mir der string für eine funktion zwar beliebig oft für sscanf zur Verfügung, aber nicht für die andere funktion.

    mfg Christoph



  • ich versteh das Problem nicht (hab auch keine lusst deinen unformatierten Code zu lesen.

    void fun1(char* input)
    {
      sscanf(input, deine Verarbeitung der ersten funktion);
    }
    
    void fun2(char* input)
    {
      sscanf(input, deine Verarbeitung der zweitenfunktion);
    }
    
    main(..)
    {
    
      char buffer[100];
      scanf("%s", buffer);
      fun1(buffer);
      fun2(buffer);
    }
    

    Du ließt den text einmal als string ein und übergibtst ihn dann beiden Funktionen, wo du ihn dann verarbeitest.



  • Hallo,

    Erst mal danke für die super Hilfe.
    Da ich erst vor kurzem mit dem programmieren angefangen habe,
    wusste ich leider nicht, dass ich einen string auf diese Art
    von einer Funktion zur andere weitergeben kann. Ich hab also
    immer nur mit stdin gearbeitet und war daher sehr eingeschränkt.

    Jetzt hab ich noch ein paar Fragen zum Code:

    1. mir ist das unterschiedliche verhalten der "einlesefunktionen" aufgefallen:

    fgets() übernimmt den string wie er eingegeben wurde (also inkl. enter)
    gets() entfernt enter
    scanf() und fscanf() ersetzen enter durch ' (dezimal: 39)

    die werte /n (fgets) und NULL (gets) stören mich nicht bei der verarbeitung
    das eingefügte ' von scanf ist aber ein problem da es im gegensatz zu /n und
    ' auch echter bestandteil der eingabe sein kann.
    ist dieses verhalten von scanf normal?

    2. da ich unter windows arbeite ist es am anfang immer nötig den Puffer von stdout auf null zu setzen. gibt es probleme wenn ich den code dann mit dieser Zeile (bzw. fflush) unter linux nutze?

    3. gibt es eine funktion die überflüssige nullen von den nachkommastellen entfernt. damit also 3.453 statt 3.453000 ausgegeben wird (mit %.3f wird ja immer auf 3 abgeschnitten, egal ob es mehr oder weniger stellen gibt.)

    void main ()
    {
    	setbuf(stdout,NULL);
    
    	char buf[BUFSIZ];
    
    	do
    	{
    		printf("Eingabe (Zahl):");
    		scanf("%s",buf);
    	}
    	while(is_float(buf)==0);
    
    	printf("Ist Zahl");
    }
    
    int is_float(buf)
    {
    	char check,c;
    	float f;
    
        check=sscanf(buf,"%f%c",&f,&c);
    
        printf("%s = buf aus main()\n",buf);
        printf("%f = Zahl am Anfang von buf\n",f);
        printf("%c (%i) = char der durch scanf das enter ersetzt hat\n",c,c);
        // gibt den char aus der auf die zahl folgt
        // also das zeichen das von der einlesefunktion (scanf)
        // das ursprüngliche enter ersetzt hat
    
        if (check!=0 && (c=='\n' || c==NULL || c==39 || c<0 || c>255))
    		{return 1;}
        else
    		{return 0;}
    }
    


  • Hallo,

    Ich hoffe es kann mir noch jemand bei meinen drei vorher genannten Fragen weiterhelfen. Außerdem bräuchte ich noch eine kleine Hilfe in Sachen Rückgabewert.

    Anstatt einfach 0 oder 1 mit return zurückzugeben würde ich gerne stdin bzw einen string zurückgeben (genau wie ich vorher einen wert an die funktion gegeben habe - func(stdin). Wie muss da die Syntax aussehen?

    mfg Christoph


Anmelden zum Antworten