bleicher: C werte einlesen

Grüße,
ich weiss, es ist noobhaft - aber leider hängen bei uns aufgaben und Verlesungen nicht immer zusammen ;( also bin ich gezwungen hier um hilfe zu bitten.

das Problem - ich muss ein char und zahl ODER zahl einlesen.
char wird dann zum multiplicator (d für 2 oder t für 3).

Das Problem

  • scanf("%c%d", c, i);
    kommt zB mit einstelliger Zahl nicht klar - es beendet die Eingabe nicht.

Geht das auch i-wie anders, außer ein String einzulesen und den key für key auszuwerten?

MFG
bleicher

  1. Hallo,

    ich weiss, es ist noobhaft

    nein, nicht wenn man sich wenigstens Mühe gibt und die Frage sinnvoll stellt. :-)

    das Problem - ich muss ein char und zahl ODER zahl einlesen.
    char wird dann zum multiplicator (d für 2 oder t für 3).

    Also hast du Eingaben wie etwa
      "t2"  für triple-two
      "d8"  für double-eight
      "d12" für double-twelve
    Verstehe ich das soweit richtig? Gibt es noch weitere Präfixe?

    Dann würde ich die gesamte Eingabe zunächst als String behandeln und dann selbst im Programm aufdröseln.

    • scanf("%c%d", c, i);

    Die Familie der scanf-Funktionen ist manchmal sehr zickig und anfällig gegen Fehler und Buffer Overflows; ich würde sie nicht empfehlen. Mit fgets() fährt man da meist besser.
    Also zum Beispiel:

    char input[MAXLEN];                 // Puffer für Eingabestring
      int  multiplier = 0;                // aus 'd' oder 't' abgeleitet
      int  number     = 0;                // Zahl nach 'd' oder 't'
      int  index      = 0;                // Index in Eingabestring

    if (fgets(input, MAXLEN, stdin))    // liest maximal (MAXLEN-1) Zeichen
                                          // plus abschließendes Nullbyte von stdin
       { switch (input[0])                // erstes Zeichen
          { case 'd':
               multiplier = 2;            // 'd' ergibt Multiplikator 2
               index++;                   // Zeichen überspringen
               break;
            case 't':
               multiplier = 3;            // 't' ergibt Multiplikator 3
               index++;                   // Zeichen überspringen
               break;
            default:
               multiplier = 1;            // alles andere ergibt 1 (Annahme)
               break;
          }
         number = atoi(input+index);      // restliche Eingabe als Zahl
         number *= multiplier;            // Multiplikator verrechnen
       }
      else                                // fgets() lieferte NULL
       { // FEHLER bei fgets() oder Eingabestring leer
       }

    So würde ich die Aufgabe jedenfalls angehen ...

    So long,
     Martin

    --
    F: Was ist schneller: Das Licht oder der Schall?
    A: Offensichtlich der Schall. Wenn man den Fernseher einschaltet, kommt immer erst der Ton, und dann erst das Bild.
    1. Grüße,
      danke sehr ;)

      nein, nicht wenn man sich wenigstens Mühe gibt und die Frage sinnvoll stellt. :-)

      war das jetzt lob oder kritik ^^?

      Dann würde ich die gesamte Eingabe zunächst als String behandeln und dann selbst im Programm aufdröseln.

      das habe ich befürchtet - ein änliches konstrukt ist bereits zusammengeschraubt, ist aber echt umständlich ;(

      MFG
      bleicher

      1. Hi,

        nein, nicht wenn man sich wenigstens Mühe gibt und die Frage sinnvoll stellt. :-)
        war das jetzt lob oder kritik ^^?

        weder/noch, es war eine wertneutral gemeinte Feststellung. :-)

        Dann würde ich die gesamte Eingabe zunächst als String behandeln und dann selbst im Programm aufdröseln.
        das habe ich befürchtet - ein änliches konstrukt ist bereits zusammengeschraubt, ist aber echt umständlich ;(

        Finde ich nicht, ist aber eine Frage der Routine. Das ist allerdings ein Beispiel, das in Assembler schon fast einfacher zu implementieren wäre ...

        Schönen Abend noch,
         Martin

        --
        Die beste Informationsquelle sind Leute, die jemand anderem versprochen haben, nichts weiterzuerzählen.
          (alte Journalistenweisheit)
        1. Grüße,

          Finde ich nicht, ist aber eine Frage der Routine. Das ist allerdings ein Beispiel, das in Assembler schon fast einfacher zu implementieren wäre ...

          es wäre einfacher, wenn man das "eintippen/enter" umgehen konnte - also dass jedes eingetippte zeichen sofort ausgwertet wird - inclusive enter (ASCII-wert 10 oder?)- geht das überhaupt?

          MFG
          bleicher

          1. Hallo,

            es wäre einfacher, wenn man das "eintippen/enter" umgehen konnte - also dass jedes eingetippte zeichen sofort ausgwertet wird - inclusive enter (ASCII-wert 10 oder?)- geht das überhaupt?

            sicher geht das - es wird aber aus der Sicht des Programmierers nicht einfacher, sondern sehr viel komplizierter. Denn dann müsste ich das Programm entweder als Schrittkette mit Warteschleifen dazwischen realisieren, oder eleganter als State Machine (im Deutschen: Automat).
            Ich finde es deutlich einfacher, die Eingabe an sich einer Betriebssystem-Funktion zu überlassen und dann den eingegebenen Text am Stück zu analysieren. Und benutzerfreundlicher ist es auch - oder wolltest du auch Editier- und Korrekturmöglichkeiten (eingegebenes Zeichen mit Backspace löschen) selbst realisieren?

            So long,
             Martin

            --
            Zwei Mäuse treiben's miteinander. Sagt der Mäuserich: "Hoffentlich ist nicht wieder alles für die Katz."
            1. Grüße,

              Ich finde es deutlich einfacher, die Eingabe an sich einer Betriebssystem-Funktion zu überlassen und dann den eingegebenen Text am Stück zu analysieren. Und benutzerfreundlicher ist es auch - oder wolltest du auch Editier- und Korrekturmöglichkeiten (eingegebenes Zeichen mit Backspace löschen) selbst realisieren?

              ok - darüber habe ich nicht nachgedacht^^
              aber dass es so komplex ist? wie sind denn die ganzen "press Y to ..."abfragen realisiert? DOS bietet es ja irgendwie - könnte man die "bertriebssystemfunktion" vllt ausnutzen?

              MFG
              bleicher