Frage

Ich versuche gerade, eine Ganzzahl in eine Zeichenfolge umzuwandeln, und ich habe ein Problem.

Ich habe den Code zum größten Teil geschrieben und gearbeitet, aber er hat einen kleinen Fehler, wenn er zum nächsten Ort trage. Es ist schwer zu beschreiben, also werde ich Ihnen ein Beispiel geben. Verwenden Sie Basis 26 mit einem Zeichensatz, der aus dem Kleinbuchstaben Alphabet besteht:

0 = "a"
1 = "B"
2 = "C"

...

25 = "Z"
26 = "BA" (das sollte gleich "aa")

Es scheint den Charakter an der Nullstelle in dem Charakter in bestimmten Situationen zu überspringen.

Das, was mich verwirrt, ist, dass ich mit meinem Code nichts falsches sehe. Ich habe jetzt schon seit zu lange daran gearbeitet und kann es immer noch nicht herausfinden.

char* charset = (char*)"abcdefghijklmnopqrstuvwxyz";
int charsetLength = strlen(charset);

unsigned long long num = 5678; // Some random number, it doesn't matter
std::string key

do
{
    unsigned int remainder = (num % charsetLength);
    num /= charsetLength;

    key.insert(key.begin(), charset[remainder]);

} while(num);

Ich habe das Gefühl, dass die Funktion über das Modulo stolpert und eine Null zurückgibt, aber ich habe so lange daran gearbeitet, dass ich nicht herausfinden kann, wie es passiert. Vorschläge sind willkommen.

Bearbeiten: Die Tatsache, dass die generierte Zeichenfolge wenig Endian ist, ist für meine Anwendung irrelevant.

War es hilfreich?

Lösung

Wenn ich richtig verstehe, was Sie wollen (die von Excel für Spalten verwendete Nummerierung 1, 2, ... 26 und die Basis ist 26. A hat also Wert 1, z Wert 26, aa Wert 27 ... Berechnung dieser Darstellung ist der normalen Wiederholung sehr ähnlich, die Sie nur für den Versatz von 1 anpassen müssen statt 0.

#include <string>
#include <iostream>
#include <climits>

std::string base26(unsigned long v)
{
    char const digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    size_t const base = sizeof(digits) - 1;
    char result[sizeof(unsigned long)*CHAR_BIT + 1];
    char* current = result + sizeof(result);
    *--current = '\0';

    while (v != 0) {
        v--;
        *--current = digits[v % base];
        v /= base;
    }
    return current;
}

// for testing
#include <cstdlib>

int main(int argc, char* argv[])
{
    for (int i = 1; i < argc; ++i) {
        unsigned long value = std::strtol(argv[i], 0, 0);
        std::cout << value << " = " << base26(value) << '\n';
    }
    return 0;
}

Laufen mit 1 2 26 27 52 53 676 677 702 703 gibt

1 = A
2 = B
26 = Z
27 = AA
52 = AZ
53 = BA
676 = YZ
677 = ZA
702 = ZZ
703 = AAA

Andere Tipps

Ihr Problem ist, dass 'a' == 0.

Mit anderen Worten, 'AA' ist nicht die Antwort, denn das ist wirklich 00. 'Ba' ist die richtige Antwort, weil b = '1', so dass es 10 in Basis 26 ist, was in Dezimalzahl 26 ist.

Ihr Code ist korrekt, Sie scheinen ihn nur missverstanden zu haben.

Ich denke, Sie sollten a = 1 und z = 0 machen, also haben Sie ABC ... Z genau wie in Dezimalzahl 1234 ... 90

Vergleichen Sie es mit dem Dezimalsystem: 9 folgt 10 und nicht von 01!

Um eine Aphrogrammer-Lösung für das Kompilieren in meinem System zu erhalten (ich verwende GCC Version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3), musste ich Header hinzufügen.#include <climits> #include<cstdlib>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top