#include <string.h>

// Addiert 1 zu einer Dualzahl (als String) und speichert das Ergebnis in output
// input:  Dualzahl als String, z.B. "1011"
// output: Ergebnis als String, z.B. "1100"
// maxlen: Maximale Länge des output-Arrays (inklusive '\0')
void dual_addiere_eins(const char *input, char *output, int maxlen) {
    int len = strlen(input);      // Länge der Eingabe bestimmen
    int carry = 1;                // Übertrag: Wir addieren 1, daher am Anfang 1
    int i, pos = 0;               // i: läuft durch input, pos: Position im temp-Array

    char temp[maxlen];            // Temporäres Array für das Ergebnis (rückwärts)
                                  // maxlen reicht, da Ergebnis maximal 1 Stelle länger als input sein kann

    // Von hinten (letztes Zeichen) nach vorne durchgehen
    for (i = len - 1; i >= 0; --i) {
        if (input[i] == '1') {        // Wenn aktuelle Ziffer 1 ist
            if (carry) {
                temp[pos++] = '0';    // 1 + 1 = 0, Übertrag bleibt 1
            } else {
                temp[pos++] = '1';    // 1 + 0 = 1, kein Übertrag mehr
            }
            // carry bleibt 1, wenn wir 1+1 gerechnet haben
        } else if (input[i] == '0') { // Wenn aktuelle Ziffer 0 ist
            if (carry) {
                temp[pos++] = '1';    // 0 + 1 = 1, Übertrag wird 0
                carry = 0;
            } else {
                temp[pos++] = '0';    // 0 + 0 = 0, kein Übertrag
            }
        } else {
            output[0] = '\0';         // Fehlerfall: ungültiges Zeichen in input
            return;
        }
    }

    // Falls nach der Schleife noch ein Übertrag übrig ist (z.B. 111 + 1 = 1000)
    if (carry) {
        temp[pos++] = '1';            // Setze noch eine 1 ganz vorne
    }

    temp[pos] = '\0';                 // String-Ende setzen

    // Jetzt temp umdrehen und in output kopieren
    // temp enthält das Ergebnis rückwärts, also müssen wir es umdrehen
    for (i = 0; i < pos; ++i) {
        output[i] = temp[pos - 1 - i];
    }
    output[pos] = '\0';               // String-Ende setzen
}