Cast von int zu char-array in C
Ist möglich, konvertieren int, "string" in C nur mit casting? Ohne Funktionen wie atoi()
oder sprintf()
?
Was ich wollen würde wie folgt Aussehen:
int main(int argc, char *argv[]) {
int i = 500;
char c[4];
c = (char)i;
i = 0;
i = (int)c;
}
Der Grund ist, dass ich generieren müssen zwei zufällige Ganzzahlen (0 bis 500) und senden Sie beide als eine Zeichenfolge in einer Warteschlange zu einem anderen Prozess. Der zweite Prozess, der die Nachricht erhält und tun das LCM.
Ich weiß, wie man mit atoi()
und itoa()
. Aber mein Lehrer will nur mit Stimmen.
Auch, warum nicht auch die folgende Möglichkeit zu kompilieren?
typedef struct
{
int x;
int y;
} int_t;
typedef struct
{
char x[sizeof(int)];
char y[sizeof(int)];
} char_t;
int main(int argc, char *argv[])
{
int_t rand_int;
char_t rand_char;
rand_int.x = (rand() % 501);
rand_int.y = (rand() % 501);
rand_char = (char_t)rand_int;
}
- Schlüssel Satz, dass 'meine Lehrer wollen" - was bedeutet, dass alles danach ist für Sie, herauszufinden, für uns nicht, Sie zu zeigen. ~lächeln~
- Sie kann sich vorstellen die Menge von Zeit, Mühe und Forschung, die ich verschwendet versuchen, das zu tun. Alles ist in Ordnung, nur der cast nicht funktioniert.
- Ich würde die Zähler, die Sie haben verschwendet, nicht eine Sekunde... du hast genau das gemacht, was der Lehrer beabsichtigt... Sie haben eine Menge Zeit damit verbracht, herauszufinden, wie man es nicht machen. Und das ist unglaublich wertvoll, wie ein Programmierer.
- Kannst du die Funktion Signatur, indem Sie es auf die message-queue? Das klingt wie der Kern des Problems.
- Ich verstehe, K Scott Piel. Also ich kann Euch sagen ich habe alles erreicht, aber casting int zu char-array. Können Sie mir bitte helfen? 🙂
- Auch, warum der zweite code, den ich gepostet nicht kompilieren?
- möglich, Duplikat der Konvertieren integer zu string-ohne Zugriff auf Bibliotheken. Dies ist die #4 Treffer für itoa auf SO. Überrascht, dass Sie es verpasst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Natürlich, es ist nicht möglich, weil ein array ist ein Objekt und muss Lagerung. CASTET das Ergebnis in Werte, nicht Objekte. Einige würden sagen, der springende Punkt/Energie von C ist, dass Sie haben die Kontrolle über die Lagerung und Lebensdauer von Objekten.
Den richtigen Weg, um erzeugen einen string mit einer Dezimalzahl Darstellung einer ganzen Zahl ist zu erstellen Speicher für es selbst und verwenden Sie
snprintf
:Müssen Sie konvertieren
500
zu"500"
."500"
ist das gleiche wie'5'
dann'0'
dann'0'
dann0
. Das Letzte element0
ist das null-Abschlusszeichen eines string.500
gleich5 * 100 + 0 * 10 + 0 * 1
. Sie haben zu tun, einige mathematische hier. Im Grunde müssen Sie die/
Betreiber.Dann könnte dies auch nützlich:
'5'
ist das gleiche wie'0' + 5
.Ohne verlosen eine genaue codiert beantworten, was Sie tun müssen, ist eine Schleife durch jede Ziffer der Ganzzahl (durch Berechnung der Rest modulo 10, die über der % - operator), und dann fügen Sie deren Wert dem ASCII-Wert von '0', Gießen Sie das Ergebnis zurück in einen char, und platzieren das Ergebnis in eine null-terminierte Zeichenfolge.
Beispiel, die vorgibt, wie die implizite Umwandlung nicht existieren könnte wie folgt Aussehen:
Bestimmen Sie die Länge des resultierenden Strings werden durch die Berechnung der log-Basis 10 von der Zahl, oder einfach durch die Zuweisung dynamisch, wie Sie gehen mit realloc().
Casting ist eine schreckliche Weise, dies zu tun aufgrund endianness, aber hier ist ein Beispiel, wie auch immer - es gibt einige Gelegenheiten, wo es sinnvoll ist (Gewerkschaften, Arbeit besser in diesen Tagen, obwohl, wegen compiler Umgang mit diesen Arten von wirft).
Für ein int mit Wert <500, wenn das höchstwertige byte zuerst kommt, dann bekommen Sie ein
"Zeichenkette"(Zeiger auf ein char-array) von "" (oder {0}), aber wenn die endianness ist LSB zuerst (x86 ist little endian), dann hätte man einen brauchbaren 3 byte"Zeichenkette"char* (nicht unbedingt Menschen lesbaren Zeichen) aber es gibt keine Garantie, dass es ein null-byte in eine integer-und da alles, was Sie haben, ist ein Zeiger auf die Adresse, wo die int gespeichert wurde, wenn Sie zu laufen waren die normalen string-Funktionen, die Sie gehen würde, über das Ende der ursprünglichen int-in no-mans-land (in kleinen test-Programmen ist es oftmals Umgebungsvariablen) ... jedenfalls für mehr Portabilität können Sie Netzwerk-byte-Reihenfolge (welche für little endian ist ein no-op):Diese Funktionen nur byteswap als notwendig, um Netzwerk-byte-Reihenfolge. Auf Ihrem x86-Sie wird wegoptimiert, so dass Sie könnte genauso gut verwenden Sie für die Portabilität.
Nur weil es noch nicht aufgeführt: Hier ein Weg, um konvertieren von int zu char-array mit variabler Größe, Zuordnung mithilfe von
snprintf
:Holen Sie sich die Anzahl der Unterteilungen, dann fügen Sie hinzu, indem man auf den Puffer