int in char * umwandeln
-
Hallo,
ich bin ein C/C++ - Neuling und habe ein Problem mit C.
Ich habe einen Integer int i=33, den ich in einen char * umwandeln möchte.
Ich habe dies hier probiert:int i = 33;
char *c;
c=(char *)i;, was aber nicht geht. Wie krieg ich das hin?
Noch eine kleine Frage: Worin besteht der Unterschied zwischen char und char * ?Vielen Dank
-
"char x" reserviert ein Byte unter dem Namen x.
"char *x" ist ein Zeiger mit dem Namen x auf ein Byte. x Beinhaltet die Adresse von einen Byte.
-
nh2 schrieb:
Noch eine kleine Frage: Worin besteht der Unterschied zwischen char und char * ?
hi,
ersteres ist der typ für variablen, die einzelne zeichen enthalten sollen. das andere (char*) ist der type von 'zeigervariablen' die auf variablen vom typ 'char' zeigen können.
beispiel:char c; // eine variable für zeichen char d; // noch eine char e; // noch eine char *p; // eine variable für zeiger auf zeichenvariablen c = 'x'; // das zeichen 'x' wird in die erste zeichenvariable geschrieben p = &c; // die adresse der ersten zeichenvariablen (c) wird in den zeiger geschrieben d = c; // das zeichen 'x' wird von c nach d kopiert e = *p; // selbiges, allerdings indirekter zugriff über den zeiger
-
nh2 schrieb:
...
Ich habe einen Integer int i=33, den ich in einen char * umwandeln möchte....Stimmt nicht !
Was Du aller Wahrscheinlichkeit möchtest, ist, "Eine lesbare Darstellung einer Zahl".Denn das, was Du beschreibst ("Integer in char* umwandeln") ist genau das, was Dein Code macht ... aber dazu sagst Du ja "klappt nicht".
Wenn ich richtig liege, ist diese FAQ das Richtige fü Dich.
Gruß,
Simon2.
-
Vielen Dank für eure Antworten,
leider hilft mir die letzte Beschreibung nicht, weil ich stdio.h nicht einbinden kann. Das Programm ist für einen Roboter, der diese Datei leider nicht hat.
Vielleicht hilft mir diese Zwischenfrage:
Wenn ich char *c = "hi", habe klappt alles.
Wenn ich char s ="hi" habe, klappt das nicht.
Wie kann ich jetzt s in einen char * umwandeln?Danke,
nh2
-
nh2 schrieb:
Wenn ich char *c = "hi", habe klappt alles.
Wenn ich char s ="hi" habe, klappt das nicht.
Wie kann ich jetzt s in einen char * umwandeln?das kann man nicht.
s ist eine normale variable, kein pointer.
was hast du überhaupt vor damit?
:xmas2:
-
nh2 schrieb:
Vielen Dank für eure Antworten,
leider hilft mir die letzte Beschreibung nicht, weil ich stdio.h nicht einbinden kann. Das Programm ist für einen Roboter, der diese Datei leider nicht hat.
Vielleicht hilft mir diese Zwischenfrage:
Wenn ich char *c = "hi", habe klappt alles.
Wenn ich char s ="hi" habe, klappt das nicht.
Wie kann ich jetzt s in einen char * umwandeln?Danke,
nh2
Sorry, ich habe den Eindruck, dass Du wirklich nicht weißt, ws Du da machst ...
In C wird nicht in erster Linie zwischen Datentypen Hin- und Herkonvertiert.
Jeder Datentyp beschreibt, was man in ihm ablegt:
In einem- ... int eine Zahl
- ... char einen Buchstaben (meistens)
- ... char* einen Zeiger auf einen Buchstaben
- ... char (*)(int) einen Zeiger auf eine Funktion mit int-Parameter und char-Returnwert
- ...
Und auch "Literale" (das sind die "konkreten Dinger") haben einen Typ:
- 32 hat den Typ int
- 'a' hat den Typ char
- "hi" hat den Typ char const* (o.ä.)
Wenn Du also Daten in einem Typ vorliegen hast, und einen anderen brauchst, musst Du Dir überlegen, was die beiden miteinander zu tun haben.
Du fragst doch auch nicht: Warum funktioniert Auto a = "Blech" nicht ?
Offensichtlich musst Du da mehr machen.Erstens:
Bist Du Dir wirklich sicher, dass ganz stdio.h Dir verboten ist ?
Dass printf(), scanf() und Co. nicht gehen, ist klar, aber auch sprintf() ? Die Funktion macht eigentlich nichts Anderes, als Du jetzt per Hand nachzubilden versuchst. Ich wüsste nicht, warum das in einem Roboter verboten sein sollte.Zweitens:
Falls es wirklich nicht geht: Wie würdest Du das denn machen, wenn ich Dir eine Zahl übers Telefon diktiere und Du sie aufschreiben musst ?
Zahl Ziffernweise bestimmen und den zugehörigen Buchstaben aufschreiben - Genauso geht's auch mit C.
Allerdings must Du dafür sorgen, dass Du genügend "Platz zum Schreiben" hast. Dazu kannst Du Dir mal das Thema "char-Arrays" ansehen....Sorry, wenn ich ein wenig harsch war.
Gruß,
Simon2.
-
Simon2 schrieb:
Sorry, wenn ich ein wenig harsch war.
Harsch sein ist nicht das Problem. Das Problem ist wenn man selbst nicht recht hat
Simon2 schrieb:
- 'a' hat den Typ char
int :p
Simon2 schrieb:
Erstens:
Bist Du Dir wirklich sicher, dass ganz stdio.h Dir verboten ist ?
Dass printf(), scanf() und Co. nicht gehen, ist klar, aber auch sprintf() ? Die Funktion macht eigentlich nichts Anderes, als Du jetzt per Hand nachzubilden versuchst. Ich wüsste nicht, warum das in einem Roboter verboten sein sollte."Verboten" ist sicher das falsche Wort. Ich tippe eher darauf, dass seine Implementierung keine stdio.h vorsieht, was in einem freestanding environment durchaus erlaubt ist.
-
Nochmal vielen Dank für die vielen Antworten.
Ich beschreibe mal genauer, was ich tun möchte:
Ich besitze einen Roboter, der über Infrarot mit meinem PC kommunizieren soll.
Mittels einer Funktion lnp_integrity_write(s,strlen(s)); kann der Roboter eine Nachricht zum PC schicken. Das Problem ist nun, dass ich immer nur Textnachrichten in Form von char * senden kann. Folgendes funktioniert:char *c = "hallo"; lnp_integrity_write(s,strlen(s));
Jetzt möchte ich aber nicht nur Text an den PC senden, sondern auch Integer, zum Beispiel die Helligkeit des Lichts. Und die muss ich dann in eine Form kriegen, die durch lnp_integrity_write() versendet werden kann.
@Simon2 und TactX:
Ja, die Einbindung von stdio.h ist auf meinem Roboter nicht vorgesehen. Daher funktioniert das sprintf() leider nicht.
Ich glaube aber, dass ich eigene *.h-Dateien einbinden kann. Ich habe mir einfach mal eine stdio.h, die ich auf meinem PC gefunden habe, kopiert und benutzt.
Diese braucht aber wiederum andere Dateien und ist ziemlich groß; ich habe auf meinem Roboter nur sehr wenig Speicher.
Kann ich selbst eine stdio.h schreiben, die nur die Funktion sprintf beinhaltet und keine oder wenige andere Dateien braucht?
-
Nimm mal die Funktion aus meiner Lieblings-FAQ: http://c-faq.com/misc/hexio.html
-
nh2 schrieb:
char *c = "hallo"; lnp_integrity_write(s,strlen(s));
hi,
wenn du damit ein einzelnes zeichen versenden willst:char c = 'a'; lnp_integrity_write (&c, 1);
oder einen integer:
int v = 0x1234; lnp_integrity_write ((char*)&v, sizeof(int));
die bytes des integers werden dabei in der reihenfolge übertragen, in der sie im speicher stehen...
:xmas2:
-
TactX schrieb:
Simon2 schrieb:
Sorry, wenn ich ein wenig harsch war.
Harsch sein ist nicht das Problem. Das Problem ist wenn man selbst nicht recht hat
...Echt ? Das war das Problem des OPs ?
Erstaunliches tritt hier zutage.
Gruß,
Simon2.
-
ten schrieb:
nh2 schrieb:
char *c = "hallo"; lnp_integrity_write(s,strlen(s));
hi,
wenn du damit ein einzelnes zeichen versenden willst:char c = 'a'; lnp_integrity_write (&c, 1);
oder einen integer:
int v = 0x1234; lnp_integrity_write ((char*)&v, sizeof(int));
die bytes des integers werden dabei in der reihenfolge übertragen, in der sie im speicher stehen...
:xmas2:Ich verstehe nicht, warum, aber es werden total kryptische Zeichenfolgen gesendet!
-
Ganz einfach: ein int wird intern als Binärwert mit (typischerweise) 4 Byte Länge gespeichert - und wenn du den als char-Array interpretierst, wird jedes diesr Bytes als Einzelzeichen gelesen. Das heißt, du mußt die int-DAten auf Binärebene wieder zurückverwandeln:
lnp_integrity_read(buffer); memcpy((char*)&v,buffer,sizeof(int));
(wenn du etwas für Menschen lesbares übergeben willst, schau mal in die C++ FAQ zum Thema "Einmal String nach Zahl und zurück" (die meisten dort genannten Funktionen klappen auch unter C).
-
nh2 schrieb:
...
Ich verstehe nicht, warum, aber es werden total kryptische Zeichenfolgen gesendet!... weil ten einfach das getan hat, wonach Du zuerst gefragt hast. (int in char* konvertiert)
Das ist aber nicht das, was Du willst/brauchst.
Wie schon CStoll sagte: Einfach die (für Maschinen verständliche) interne Darstellung einer Zahl (int) auszugeben, hilft Dir nicht weiter (hast Du gerade festgestellt). Du musst die Zahl in einen für den Menschen lesbare Zahl umwandeln .. und das hat eigentlich nicht so sehr etwas damit zu tun, dass Du die Daten von einem Roboter an einen PC senden willst, als vielmehr, dass sich ein Mensch das ansehen soll.Dasselbe müsstes Du auch machen, wenn Du auf dem Roboter einen Display hättest oder eine Zahl auf dem PC hättest und die anzeigen möchtest.
Um diese Umwandlung "Maschinendarstellung->Menschdarstellung" hinzubekommen, haben CStoll und ich Dir schon Tipps gegeben ... einfacher geht's leider nicht (wenn Du kein sprintf() oder itoa() hast.
Gruß,
Simon2.
-
Simon2 schrieb:
Um diese Umwandlung "Maschinendarstellung->Menschdarstellung" hinzubekommen, haben CStoll und ich Dir schon Tipps gegeben ... einfacher geht's leider nicht (wenn Du kein sprintf() oder itoa() hast.
Doch - der Roboter sendet den int-Wert als Byte-Haufen und der PC auf der Empfänger-Seite erkennt den Datentyp und wandelt den Wert in etwas lesbares um (auf der PC-Seite dürften sprintf() und Konsorten kein Problem sein).
-
CStoll schrieb:
Simon2 schrieb:
Um diese Umwandlung "Maschinendarstellung->Menschdarstellung" hinzubekommen, haben CStoll und ich Dir schon Tipps gegeben ... einfacher geht's leider nicht (wenn Du kein sprintf() oder itoa() hast.
Doch - der Roboter sendet den int-Wert als Byte-Haufen und der PC auf der Empfänger-Seite erkennt den Datentyp und wandelt den Wert in etwas lesbares um (auf der PC-Seite dürften sprintf() und Konsorten kein Problem sein).
Äh ....
an "einfacher geht's nicht, wenn man kein sprintf() oder itoa() hat" ist doch nichts falsch, oder ?Es sieht ganz danach aus, als hätte der OP die Option "Veränderung der PC-Schnittstelle" nicht (und selbst wenn, habe ich durchaus darauf hingewiesen, dass man eine entsprechende Umwandlung auch auf dem PC machen muss - und sei es mit sprintf()).
Bislang hat der OP immer versucht, mit einem "geschickten cast" um diese Arbeit herumzukommen und das kann er IMO nicht.
Gruß,
Simon2.
P.S.: Damit, einen int einfach so über Maschinengrenzen (mit unterschiedlicher Architektur) hinwegzusenden, wäre ich ebenfalls sehr vorsichtig ...
-
CStoll schrieb:
Ganz einfach: ein int wird intern als Binärwert mit (typischerweise) 4 Byte Länge gespeichert - und wenn du den als char-Array interpretierst, wird jedes diesr Bytes als Einzelzeichen gelesen. Das heißt, du mußt die int-DAten auf Binärebene wieder zurückverwandeln:
lnp_integrity_read(buffer); memcpy((char*)&v,buffer,sizeof(int));
Ich glaube, dass das mit memcopy funktionieren kann. Ich habe als Test erst einmal eine normale Zeichenkette benutzt. Diese gebe ich auf dem Display des Robos aus (mit cputs(<<TEXT>>);). Das müsste genau so funktionieren wie lnp_integry_write(), ist aber einfacher zu überprüfen.
char v[3] = "ha2"; char buffer[3]; memcpy(buffer,v,3); cputs(buffer);
Das funktioniert. Auf dem Display steht ha2.
Jetzt versuche ich es mit einem Integer.
Ich dachte da an sowas:int i = 33; char buffer[30]; memcpy(buffer,&i,sizeof(int)); cputs(buffer);
Geht aber nicht. Was mache ich falsch?
-
Du liest nur die Hälfte des Threads - in einem int steht eine binäre Repräsentation des Zahlenwertes (und der sieht, als char* interpretiert, katastrophal aus). Für die Darstellung kommst du nicht darum, itoa() und Konsorten zu verwenden (wenn nicht vorhanden, mußt du es nachprogrammieren).
(PS: der String "ha2" benötigt übrigens 4 Byte (eins für das Stringende-Zeichen '\0'), da ist dein Test-Array etwas zu kurz gewählt)
-
Simon2 schrieb:
P.S.: Damit, einen int einfach so über Maschinengrenzen (mit unterschiedlicher Architektur) hinwegzusenden, wäre ich ebenfalls sehr vorsichtig ...
für sowas muss man eigentlich ein protokoll benutzen, in dem genau festgelegt ist, wie ein 'int' für die übertragung auszusehen hat. erst recht, wenn man auch zwischendurch mal andere datentypen, wie strings oder doubles verschicken will...
:xmas2:edit: was ganz einfaches ist z.b. das hier: http://en.wikipedia.org/wiki/Type-length-value