#include <string.h>

// Addiert 1 zu einer Dualzahl (als String) und speichert das Ergebnis in output
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, j;                         // Schleifenvariablen

    char temp[maxlen];                // Temporäres Array für das Ergebnis (rückwärts)
    temp[maxlen-1] = '\0';            // String-Ende setzen

    // Von hinten (letztes Zeichen) nach vorne durchgehen
    for (i = len - 1, j = maxlen - 2; i >= 0 && j >= 0; --i, --j) {
        if (input[i] == '1') {        // Wenn aktuelle Ziffer 1 ist
            temp[j] = carry ? '0' : '1'; // Mit Übertrag: 1+1=0 (Übertrag bleibt), sonst 1
            // carry bleibt 1, wenn carry==1 und input[i]=='1'
        } else if (input[i] == '0') { // Wenn aktuelle Ziffer 0 ist
            temp[j] = carry ? '1' : '0'; // Mit Übertrag: 0+1=1 (Übertrag wird 0), sonst 0
            carry = 0;                   // Übertrag ist jetzt weg
        } else {
            output[0] = '\0';            // Fehlerfall: ungültiges Zeichen
            return;
        }
    }
    // Falls nach der Schleife noch ein Übertrag übrig ist (z.B. 111 + 1 = 1000)
    if (carry && j >= 0) {
        temp[j--] = '1';                 // Setze noch eine 1 ganz vorne
    }
    // Rest mit Nullen auffüllen (falls nötig)
    while (j >= 0) temp[j--] = '0';

    // Führende Nullen entfernen (außer die letzte Ziffer)
    int start = 0;
    while (temp[start] == '0' && temp[start+1] != '\0') ++start;
    strcpy(output, temp + start);        // Ergebnis in output kopieren
}