C - Zeichenkette umdrehen und Binärdartsellung

dragonballz

Grünschnabel
Hallo Leute,

ich wollte nen Programm schreiben, mit dem ich in C eine Zahl in Binär ausgebe. Dazu habe ich noch zusätzlich eine Funktion geschrieben, die ein ArrayFeld umdrehen soll, also z.B. 123 = 321, da mein Programm zur Umrechnung von Zahl zur Binär die Binärzahl umgedreht darstellt.

Mein Code ist etwas lang, ich hoffe es macht euch nichts aus euch etwas Zeit zu nehmen um sich reinzudenken:

MEin Problem: Wenn ich die Methode "Zeichen_drehen" verwenden möchte damit das Array, in dem die umgedrehte Binärzahl gespeichert ist, die Binärzahl umdreht(also richtig darstellt), wird am Ende nur eine Zahl angezeigt.
Versucht es mal seber mit eurem IDE.
Ohne die drittletzte Anweisung "Zeichenkette_drehen(str)" wird der komplette Arrayinhalt angezeigt, aber natürlich wie gesagt umgedrehte Binärzahlen.

C++:
    #include <stdio.h>
     
     
    void Zeichenkette_drehen(char bla[])
    {
    int i=0,c=0;
    while(bla[i] != '\0') /* Damit berechne ich die Zeichenlänge im Feld bla*/
    {
    i++;
    c++;
    }
     
    char um[ c];
    for(i=0;c>0;c--) /*hier pack ich alles von bla[] in um[] (um[] dient als zwischenspeicher)*/
    {
    um[i]=bla[c-1];
    }
    um[i+1] = '\0';
     
    for(c=0;i>=0;i--,c++) /* Hier pack ich wieder als vom Zwischenspeicher in bla[] */
    {
    bla[ c]=um[ c];
    }
    bla[ c] = '\0';
     
    }
     
     
    int main()
    {
    int i=0, zahl, b=DIGITS; /* DIGITS wurde in einer Header Datei definiert und ist 8 */
    char str[20];
     
    scanf("%d", &zahl);
    while(b >0)
    {
    if(zahl%2 == 1)
    {
    str[i] = '1';
    }
    else
    str[i] = '0';
     
    zahl= zahl/2;
    i++;
    b--;
    }
    str[i] = '\0';
     
    Zeichenkette_drehen(str);
     
    printf ("Zahl int:%d als Binaerzahl: %s\n",zahl, str);
    return 0;
    }

PS: Ich weiss es gibt bestimmt irgendwoe in der Biblithek von C eine Methode mit der man Strings verdrehen kann, ich möchte es aber nal selber versuchen :)
 
Hi und Willkommen bei tutorials.de,

Zu den fertigen Funktionen:
Etwas zum Umdrehen kenn ich jetzt zumindest auswendig nicht,
aber es würde strlen zum Längen-bestimmen und strcpy zum 1:1-Kopieren geben
Damit würdest du dir schon zwei Drittel der Funktion sparen :)

Probleme:
um hat c Zeichen, braucht aber c+1. Du hast die '\0' vergessen.
Die mittlere for-Schleife hat nirgends ein i++.

(und das "char um[ c ]" ist auch etwas problematisch, bez. Standard.
Bei dir aber anscheinend kein Problem, und da es nur ein Übungsprogramm ist...)
 
Hi,

auch von mir herzlich Willkommen im Forum ;)

Meiner Meinung machst du es auch ein wenig zu kompliziert.
Ich habe mal schnell eine andere Variante erstellt:
C++:
void dirRev(char *str) {
  size_t len = strlen(str);
  
  size_t i = 0;
  for (; i<(len/2); i++) {
    char tmp = str[i];

    str[i] = str[len-i-1];
    str[len-i-1] = tmp;
  }
}
Zuerst wird die Länge via strlen bestimmt.
Danach wird vom Anfang aus über den String bis hin zur Mitte iteriert.
Nun werden das aktuelle Zeichen an Position i und das Zeichen an Position i vom Anfang aus gesehen getauscht.
Dazu braucht man noch eine temporäre Variable, damit der Wert nicht verloren geht.

Es gibt natürlich auch noch die Profi-Variante mittels XOR-Swapping: http://stackoverflow.com/a/198264/603003
 

Neue Beiträge

Zurück