printf und cout überschreibt Ausgabe



  • Hallo,
    ich habe eine Frage zur Ausgabe in die Konsole: Wenn ich mit folgendem Code einen Tabulator ausgebe um danach weiter Zahlen eingeben zu lassen, überschreibt der Taulator die bisherige Ausgabe. Es wird mit jedem printf wieder am Anfang der Zeile begonnen.
    Wie ist es möglich, den Tabulator an die Ausgabe anzuhängen?

    Danke schonmal für eure Antworten. 🙂

    for (i = 0; i < n; i++) {
            //Kommazahl einlesen
            noten[i] = 0;
            z = 10; y = 1;
            do {
                temp = _getche();
                if(z == 1) y *= 10;         //Bei Kommastelleneingabe: y * 10
                if (temp == 44) z = 1;      //Wenn Komma gedrückt wurde, wird begonnen die Nachkommastellen zu beschreiben
    
                if (temp != 44 && temp != 13) {
                    zahl = temp - '0';
                    noten[i] = noten[i] * (float)z + ((float)zahl / (float)y);  //Normale Eingabe: Zahlen werden durch <wert * 10 + NeueZahl> erzeugt, bei Nachkommastellen durch <wert + neueZahl/10>
                }
            } while (temp != 13);
            printf("\t");
        }
    




  • SG1 schrieb:

    https://www.c-plusplus.net/forum/p2491402

    Schön, und was hilft mir das? Geantwortet hat mir da auch keiner. Ich dachte ich probiere es mal in der anderen kategorie, da ich mich mit der genauen Bezeichnung vertan habe.

    Aber in diesem Forum ist anscheinend keiner bereit, Hilfe anzubieten.
    Probiere ich halt ein anderes Forum. 👎



  • marvelousmarv schrieb:

    Wie ist es möglich, den Tabulator an die Ausgabe anzuhängen?

    Welche Ausgabe?


  • Mod

    marvelousmarv schrieb:

    Aber in diesem Forum ist anscheinend keiner bereit, Hilfe anzubieten.
    Probiere ich halt ein anderes Forum. 👎

    Sehen die anderen Threads im Forum so aus, als läge mangelnde Hilfsbereitschaft vor? Es gibt jedoch einen Thread ganz oben in diesen Forum, dessen Titel genau zu deinem hier demonstrierten Problem passt:
    https://www.c-plusplus.net/forum/136013



  • Hallo marvelousmarv!

    Leider ist das ganze aus dem kopletten Zusammenhang gerissen, so dass
    eine Sinnvolle Analyse nicht möglich ist.

    Trotzdem kleiner Tipp:

    verwende lieber

    if (temp == ',') z = 1;
    

    statt

    if (temp == 44) z = 1;
    

    das ist sicherer.
    Ebenso könnte es sein, das bei

    while (temp != 13);
    

    nichts passiert, da bei einigen Systemen beim drücken der Entertaste
    nur der Scancode 10 zurückgegeben wird.
    probier mal

    while (temp != 10);
    

    aus.

    Da du übrigens

    noten[i] = 0;
    

    hast, kannst du diese Variable so oft wie du willst multiplizieren, es
    bleibt immer noch der Wert 0.
    Besser wäre da

    noten[i] *=  (float)z + ((float)zahl / (float)y);
    

    Dazu müsste aber wie gesagt noten[i] ungleich Null sein.

    Im Gegensatz zu getch() erfolgt bei getche() eine Ausgabe des eingegebenen
    Zeichens.
    Willst du, das bei jedem Zeichen der Tabulator vorrückt bei der Ausgabe, dann

    temp = _getch();
    printf("%c", temp);
    

    aberdann brauchst du keine

    \t
    

    Abweisung mehr.
    Mit welchen System arbeitest du?
    Mir ist die Möglichkeit, ein Zeichen auszugeben, ohne das der Tabulator
    dabei weiter rückt, nur aus DOS-Zeiten bekannt. Damals konnte man mit
    Interrupt 10h Funktion 0Ah ein Zeichen an der Curserposition ausgeben,
    bei 09h mit Attribut. Bei der Funktion 0Eh wurde das Zeichen im TTY-Modus
    ausgegeben.
    Es sei denn, am schrieb direkt in den Videospeicher rein. Das hatte aber den
    selben Effekt.

    Wenn du kein getch hast, da möglicherweise dein Compiler nur
    ANSI unterstützt kannst du dir selber eine getch()-Funktion basteln mit

    #ifndef GETCH_H_INCLUDED
    #define GETCH_H_INCLUDED
    
    #include <stdio.h>
    #include <termios.h>
    #include <unistd.h>
    
    int getch(){
        struct termios oldt, newt;
        int ch;
        tcgetattr( STDIN_FILENO, &oldt );
        newt = oldt;
        newt.c_lflag &= ~( ICANON | ECHO );
        tcsetattr( STDIN_FILENO, TCSANOW, &newt );
        ch = getchar();
        tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
        return ch;
    }
    
    void clpuf(void)
     {
     while (getc(stdin) != '\n')
        ;
     }
    
    #endif // GETCH_H_INCLUDED
    


  • Hallo marvelousmarv!

    Deinen Code habe ich mir mal angesehen und eine prinzipielle Lösung erarbeitet.
    Aber du darfst bei dem Vorschlag wirklich nur Kommas oder Zahlen eingeben.
    Sonst gibt das Programm nur käse aus.
    Ich habs bei mir probiert und es hat funktioniert. Aber fehlerkorrigierende Eingabe gibt es in diesen Beispiel eben nicht. Das musst du schon selber erledigen.
    Ist ja auch nur ein Vorschlag.
    Gecodet wurde mit codeblocks 16.01 auf Suse Leap 42.1.

    Hier mein Vorschlag zu testen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <termios.h>
    #include <unistd.h>
    // Für gcc compiler, falls getch() oder _getch() nicht vohanden
    int getch(){
        struct termios oldt, newt;
        int ch;
        tcgetattr( STDIN_FILENO, &oldt );
        newt = oldt;
        newt.c_lflag &= ~( ICANON | ECHO );
        tcsetattr( STDIN_FILENO, TCSANOW, &newt );
        ch = getchar();
        tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
        return ch;
      //printf("%c", ch);
    }
    
    void clpuf(void)
     {
     while (getc(stdin) != '\n')
        ;
     }
    
    double LeseZahlstringEin(void)
    {
     int y = 0;
     double erge = 0, zahl, z = 10;
     char temp;
    
        do
         {
          temp = getch();
          zahl = (double)(temp - '0');
    
          if (temp == ',')
          {
           y = 1;
           z = 1;
          }
    
         if ((y == 0) && (temp !=','))
          erge *= z;
    
          if (y)
           {
           zahl *= z;
            z /= 10;
           }
    
           if ((temp != ',') && (temp != '\n'))
            {
             erge += zahl;
             printf("%c", temp);
            }
           if (temp == ',')
            printf(",");
           //printf("\nerge=%lf   zahl=%lf   y=%d  z=%lf", erge, zahl, y, z);
    
         }
         while (temp != '\n');
    
    return erge;
    }
    
    int main()
    {
     int i, n; //, y;
     double noten[20];
     //double z, zahl, erge;
     //char temp; //, zahlwort[50];
    
     printf("Hello world!\n");
     //clpuf();
     n = 4;
    
     for (i = 0; i < n; i++)
      {
       noten[i] = LeseZahlstringEin();
       printf("\t");
      }
    
    for (i = 0; i < n; i++)
     printf("\nnoten[%d]=%lf", i, noten[i]);
    
    printf("\nProgrammende");
        return 0;
    }
    

    Schreib mir, ob ich dir helfen konnte!



  • Kleiner Nachtrag:

    Bei folgender Funktion

    double LeseZahlstringEin(void)
    {
     int y = 0, zeichenzaehler = 0, vorzeichen = 0;
     double erge = 0, zahl, z = 10;
     char temp;
    
        do
         {
          temp = getch();
          if ((zeichenzaehler == 0) && (temp == '-')) vorzeichen = 1;
          if ((temp == 'O') || (temp  == 'o'))
           temp = '0';
          if (( temp >= '0') && (temp <= '9'))
           zahl = (double)(temp - '0');
    
         if ((temp == '.') || (temp  == ';')|| (temp  == ':'))
          temp = ',';
    
         if (temp == ',')
          {
           y = 1;
           z = 0.1;
          }
    
         if ((y == 0) && (temp !=',') && ( temp >= '0') && (temp <= '9'))
          erge *= z;
    
          if ((y != 0) && ( temp >= '0') && (temp <= '9'))
           {
           zahl *= z;
            z /= 10;
           }
    
           if (( temp >= '0') && (temp <= '9'))
            erge += zahl;
    
           if ((temp != ',')  && (temp != '\n'))
            printf("%c", temp);
           if (temp == ',')
            printf(".");
           zeichenzaehler++;
         }
         while (temp != '\n');
    
    if (vorzeichen) erge *= -1;
    return erge;
    }
    

    Werden Fehleingaben etwas milder behandelt.
    Gleich ob man ein Komma, Punkt, Semikolon oder Doppelpunkt eingibt, die
    Funktion interpretiert das als Dezimalpunkt.
    Falls man statt einer '0' ein 'o' oder ein 'O' eingibt, wird das als
    '0' interpretiert.
    andere Buchstaben wie a, b,d,c,bis z werden gar nicht berücksichtigt.
    Gibt man zum Beispiel 123;0asd1245xyz ein, wird 123.01245 daraus.
    Für eine Implementierung von einem Rückschritt hatte ich keine Lust.
    Das überlasse ich anderen.
    Einen Wagenrücklauf und ein Zeilenvorschub ist in dieser Funktion auch nicht
    dabei. Man kann also mehrere Zahlen in einer Zeile eingeben.

    Soll ja bei mir ein Hobby bleiben und kein Beruf werden. Hat auch mit
    51 Jahren keinen Sinn mehr. Eher wird Papst Franziskus Vater, als das ich
    im dem Alter noch einen Arbeitsplatz bekomme. Aber lassen wird das, Scherz beiseite.

    Viel Spaß bei programmieren.


Log in to reply