it-swarm.com.de

Casting in Char Array in C

Ist es möglich, int in "string" zu konvertieren, indem Sie einfach das Casting verwenden? Ohne Funktionen wie atoi() oder sprintf()?

Was ich möchte, wäre so:

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 zwei zufällige Ints (0 bis 500) erzeugen und beide als eine Zeichenfolge in einer Nachrichtenwarteschlange an einen anderen Prozess senden muss. Der andere Prozess empfängt die Nachricht und führt das LCM durch.

Ich kann mit atoi() und itoa() umgehen. Aber meine Lehrer wollen einfach Gips verwenden.

Warum ist auch das Kompilieren nicht möglich?

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;
}
9
Bodosko

Natürlich ist dies nicht möglich, weil ein Array ein Objekt ist und Speicher benötigt. Casts führen zu Werten , nicht Objekten . Einige würden sagen, der ganze Punkt/die Stärke von C ist, dass Sie die Speicherung und Lebensdauer von Objekten kontrollieren können.

Die richtige Methode zum Generieren einer Zeichenfolge, die eine dezimale Darstellung einer Ganzzahl enthält, besteht darin, Speicherplatz dafür zu erstellen und snprintf zu verwenden:

char buf[sizeof(int)*3+2];
snprintf(buf, sizeof buf, "%d", n);
11
R..

Sie müssen 500 in "500" konvertieren.

"500" ist das gleiche wie '5', dann '0', dann '0' dann 0. Das letzte Element 0 ist der Nullterminator einer Zeichenfolge.

500 ist gleich 5 * 100 + 0 * 10 + 0 * 1. Du musst hier etwas rechnen. Grundsätzlich müssen Sie den Operator / verwenden.

Dann könnte dies auch nützlich sein: '5' ist das gleiche wie '0' + 5.

4
ouah

Casting ist ein schrecklicher Weg, dies aufgrund der Endianness zu tun, aber hier ist trotzdem ein Beispiel - es gibt einige Gelegenheiten, in denen es nützlich ist (Gewerkschaften arbeiten heutzutage jedoch besser, weil der Compiler solche Cast-Typen bearbeitet).

#include <stdio.h> //for printf 
#define INT(x) ((int*)(x)) //these are not endian-safe methods
#define CHAR(x) ((char*)(x))
int main(void)
{
    int *x=INT(&"HI !");
    printf("%X\n",*x); //look up the ascii and note the order
    printf("%s\n",CHAR(x));
    return 0;
}

Wenn für ein int mit einem Wert <500 das höchstwertige Byte an erster Stelle steht, erhalten Sie ein "string" (Zeiger auf ein Char-Array) von "" (oder {0}), aber wenn der Endwert zuerst LSB ist (x86 ist Little Endian), würden Sie ein brauchbares 3 Byte erhalten "string" char * (nicht unbedingt für Menschen lesbare Zeichen), aber es gibt keine Garantie, dass in einer Ganzzahl ein Null-Byte vorhanden ist. Da Sie lediglich einen Zeiger auf die Adresse haben, unter der das int gespeichert wurde, sollten Sie normale Stringfunktionen ausführen Englisch: emagazine.credit-suisse.com/app/art ... = 118 & lang = en Sie würden das Ende des ursprünglichen Int in no - mans - land übergehen (in kleinen Testprogrammen werden dies häufig Umgebungsvariablen sein) ... für mehr Portabilität können Sie die Bytereihenfolge des Netzwerks verwenden (was für Little Endian ein no-op):

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

Diese Funktionen sind nur Byteswap, um die Bytereihenfolge im Netzwerk zu erhalten. Auf Ihrem x86 werden sie wegoptimiert, sodass Sie sie auch für die Portabilität verwenden können.

2
technosaurus

Ohne eine genaue codierte Antwort preiszugeben, müssen Sie die einzelnen Ziffern der Ganzzahl durchlaufen (durch Berechnen des restlichen Modulo 10 über den Operator%) und dann ihren Wert zum Wert ASCII von addieren '0', wandelt das Ergebnis zurück in ein Zeichen und setzt dieses Ergebnis in eine mit Null endende Zeichenfolge.

Ein Beispiel, das vorgibt, dass implizite Casts nicht existieren, könnte folgendermaßen aussehen:

char c = (char) ( ((int) '0') + 5 ); // c should now be '5'.

Sie können die Länge der resultierenden Zeichenfolge bestimmen, indem Sie die Protokollbasis 10 der Zahl berechnen oder sie einfach mit realloc () dynamisch zuweisen, während Sie gehen.

2
CmdrMoozy

Nur weil es noch nicht aufgeführt ist: Hier eine Möglichkeit, mit Hilfe von snprintf ein Array mit variabler Größe in ein Char-Array zu konvertieren:

int value = 5

// this will just output the length which is to expect
int length = snprintf( NULL, 0, "%d", value );

char* valueAsString = malloc( length + 1 );// one more for 0-terminator
snprintf( valueAsString, length + 1, "%d", value );
1
Alex

ermitteln Sie die Anzahl der Unterteilungen, und fügen Sie dann eine nach der anderen zu Ihrem Puffer hinzu

char *int2str(int nb) {
    int i = 0;
    int div = 1;
    int cmp = nb;
    char *nbr = malloc(sizeof(char) * 12);

    if (!nbr)
        return (NULL);
    if (nb < 0)
        nbr[i++] = '-';
    while ((cmp /= 10) != 0)
        div = div * 10;
    while (div > 0) {
        nbr[i++] = abs(nb / div) + 48;
        nb = nb % div;
        div /= 10;
    }
    nbr[i] = '\0';
    return (nbr);
}
0
Locoder