C – int in String umwandeln

C-Bibliothek (int2str)

Stand: 01/06/2018

bei ncurses bin  ich einmal auf ein Problem gestoßen das mvprintw() einen Pointer auf char-Array (int printw(const char *fmt, …) erwartet. Ich hatte aber nur Zahlen die dargestellt werden sollten. Es musste also eine Funktion her die den int in einen String, Char oder Array  umwandelt. Ein itoa() ist ja nicht immer verfügbar. Hier meine eigene Implementation, das sie nicht unbedingt die schnellste ist leuchtet ein aber es geht mir hier eher um die Vorgehensweise:

 

#include <stdlib.h>
#define ASCII_SHIFT 48

/**
 * Wandelt einen int in *char um
 *
 * @param i als Integer
 * @return unsigned *char
 */
unsigned char *int2str(int i) {
  unsigned char *str;
  int len, tmp, c;

  /* Platz schaffen fuer negatives Vorzeichen falls i negativ ist */
  len = (i < 0) ? 2 : 1;

  /* berechnen wieviele Zeichen benötigt werden */
  for (tmp = i; tmp != 0; tmp /= 10) {
    len++;
  }

  /* Unbedingt an der Stelle an der aufgerufen wird den Speicher wieder
   * freigeben! */
  str = malloc(sizeof (char) * len);

  /* Den gesamten String füllen
   * Ohne Fuellen habe ich am ende des Strings immer undefinierte Zeichen */
  for (tmp = 0; tmp <= len; tmp++) {
    str[tmp] = '\0';
  }

  /* Ein Zeichen zurueckspringen, letztes Zeichen ist bereits
   *  0-terminiert */
  len--;

  /* Übergebene Zahl ist negativ?*/
  if (i < 0) {
    str[0] = '-';
  }

  /* Ist die übergebene Zahl etwa eine 0? 
   * Wenn ja nur eine 0 einfuegen an erster Stelle.
   */
  if (i == 0) {
    str[0] = '0';
  } else {
    /* Die Zahlen in Zeichen umwandeln */
    for (tmp = i, len--; tmp != 0;) {
      c = (tmp >= 0) ? (tmp % 10) : (tmp % 10) * -1;
      str[len--] = (char) (c + ASCII_SHIFT);
      tmp /= 10;
    }
  }
  return str;
}

Wichtig ist hier das man den Speicherplatz mit free() wieder freigibt der mit malloc reserviert wurde! Wenn jemand Verbesserungsvorschläge hat dann bitte her damit.

Alternativ kann man das ganze natürlich auch mit sprintf() machen.

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.