/*
Loesung der Aufgabe 8-4 Binaerzahl einlesen.
Diese Loesung prueft auch auf alle denkbaren Fehleingaben!
*/


#include <stdio.h>

int read_bin(void)
{
  int z;
  char s[80];      /* die eingegebene Zahl als Zeichenkette */
  int i, n;
  int vorzeichen;
  int error;
  int maxdigits;

  /* maximale Anzahl der Binaer-Ziffern berechnen, um zu pruefen,
     ob die Zahl als int-Wert darstellbar ist */
  maxdigits = sizeof(int) * 8;

  do {
    error = 0;
    z = 0;       // die Zahl
    n = 0;       // Anzahl der Dualziffern
    printf("Zahl im Dualsystem [-]101....001 ? ");
    scanf("%s", s);
    vorzeichen = +1;
    switch (s[0]) {
      case '-':
        vorzeichen = -1;
        break;
      case '+':
        break;
      case '0':
        n = 1;
        break;
      case '1':
        z = 1;
        n = 1;
        break;
      default:
        printf("Keine gueltige Binaerzahl\n");
        error = 1;
    }
    i = 1;
    while (!error && s[i] != '\0') {
      if (s[i] == '0' || s[i] == '1') {
        z = z*2 + (s[i] - '0');
        i++; n++;
        if (n == maxdigits) {
          printf("Nur maximal %i Dualziffern moeglich\n", maxdigits - 1);
          error = 1;
        }
      }
      else {
        printf("Keine gueltige Binaerzahl\n");
        error = 1;
      }
    }
  }
  while (error);

  return z*vorzeichen;
}


int main(void)
{
  int z;

  do {
    z = read_bin();
    printf("z = %i\n", z);
  } while (z != 0);

  return 0;
}