12 Stimmen

Konvertierung von Integer in String ohne Zugriff auf Bibliotheken

Kürzlich habe ich eine Beispielfrage für ein Vorstellungsgespräch gelesen:

Schreiben Sie eine Funktion zur Umwandlung einer Ganzzahl in eine Zeichenkette. Angenommen, Sie haben keinen Zugang zu Bibliotheksfunktionen, z.B., itoa(), etc...

Wie würden Sie das anstellen?

10voto

John Boker Punkte 80493

Schneller Versuch: (bearbeitet, um negative Zahlen zu behandeln)

int n = INT_MIN;
char buffer[50];
int i = 0;

bool isNeg = n<0;

unsigned int n1 = isNeg ? -n : n;

while(n1!=0)
{
    buffer[i++] = n1%10+'0';
    n1=n1/10;
}

if(isNeg)
    buffer[i++] = '-';

buffer[i] = '\0';

for(int t = 0; t < i/2; t++)
{
    buffer[t] ^= buffer[i-t-1];
    buffer[i-t-1] ^= buffer[t];
    buffer[t] ^= buffer[i-t-1];
}

if(n == 0)
{
    buffer[0] = '0';
    buffer[1] = '\0';
}   

printf(buffer);

10voto

Benoit Thiery Punkte 6185

Eine Suche im Internet nach Itoa-Implementierungen liefert Ihnen gute Beispiele. Hier ist eines, das die Umkehrung des Strings am Ende vermeidet. Es basiert auf einem statischen Puffer, also seien Sie vorsichtig, wenn Sie ihn für verschiedene Werte wiederverwenden.

char* itoa(int val, int base){

    static char buf[32] = {0};

    int i = 30;

    for(; val && i ; --i, val /= base)

        buf[i] = "0123456789abcdef"[val % base];

    return &buf[i+1];

}

7voto

dnbwise Punkte 1032

Der Algorithmus ist im Englischen leicht zu erkennen.

Gegeben eine ganze Zahl, z.B. 123

  1. Dividieren durch 10 => 123/10. Ergibt Ergebnis = 12 und Rest = 3

  2. 30h zu 3 addieren und auf den Stapel schieben (durch Hinzufügen von 30h wird 3 in die ASCII-Darstellung umgewandelt)

  3. Schritt 1 wiederholen, bis das Ergebnis < 10 ist

  4. 30h zum Ergebnis addieren und auf dem Stapel speichern

  5. Der Stapel enthält die Zahlen in der Reihenfolge 1 | 2 | 3 | ...

2voto

nategoose Punkte 11636

Ich würde daran denken, dass alle Ziffernzeichen im ASCII-Zeichensatz in aufsteigender Reihenfolge stehen und keine anderen Zeichen dazwischen haben.

Ich würde auch die / und die % Betreiber wiederholt.

Wie ich vorgehen würde, um den Speicher für die Zeichenfolge zu erhalten, hängt von den Informationen ab, die Sie nicht angegeben haben.

1voto

Armen Tsirunyan Punkte 125469

Angenommen, es ist dezimal, dann wie folgt:

   int num = ...;
   char res[MaxDigitCount];
   int len = 0;
   for(; num > 0; ++len)
   {
      res[len] = num%10+'0';
      num/=10; 
   }
   res[len] = 0; //null-terminating

   //now we need to reverse res
   for(int i = 0; i < len/2; ++i)
   {
       char c = res[i]; res[i] = res[len-i-1]; res[len-i-1] = c;
   }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X