C int to char

Dshing

Lt. Commander
Registriert
Nov. 2007
Beiträge
1.436
Hallo, ich stehe gerade voll auf dem Schlauch und brauche Hilfe.

Ich habe eine Unterfunktion, die ein character übergeben bekommen will um es zu interpretieren, also z.B. '3'
Jetzt will ich diese '3' aber als "rechnbare" Variable haben also z.B. int i = 1 + 2;
Wie übergebe ich der Unterfunktion jetzt die integer 3, damit sie diese als character '3' also Ascii äquivalent 51 versteht?

Ich komme einfach nicht drauf...
 
Einfach mal nach googeln. ;)
Beispiel:
Code:
int i;
char c = '3';
i = (int)c;
 
Code:
char c = '3';
int i = c - '0';
Umgekehrt:
Code:
int i = 3;
char c = (char)(i + '0');
 
  • Gefällt mir
Reaktionen: Revan1710
Schau dir mal die function atoi (ascii to int) an.

EDIT: Header ist stdlib.h
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: BeBur
Was zur Hölle: Du musst doch lediglich den Titel deiner Anfrage in eine Suchmaschine eingeben und bekommst direkt die Lösung.
 
  • Gefällt mir
Reaktionen: NJay
M@rsupil@mi schrieb:
Einfach mal nach googeln. ;)
Beispiel:
Code:
int i;
char c = '3';
i = (int)c;
C ist lange her, aber das wird nicht das erwünschte Ergebnis liefern, weil ein gecasteter char schlicht und ergreifend den ASCII-Code zurückgibt. i wird also nicht =3 sein, sondern =51. Theoretisch kann man natürlich darauf triggern und die 51 auswerten (zB den ASCII-Code für '0' = 48 abziehen), aber naja... Das wäre dann ja die oben bereits vorgeschlagene Variante mit -'0' bzw. +'0'
 
Wenn man sowas selbst implementieren will ist es immer mal schlau in die gute alte ASCII Tabelle zu schauen.
Für den Fall, dass du wirklich nur eine Ziffer umwandeln willst ist das relativ einfach. Die Codelösung wurde hier ja schon erwähnt.

In der Tabelle siehst du, dass Ascii 0 den Wert 48 oder 0x30 hat. Alle weiteren Ziffern sind aufsteigend dahinter. Wenn du nun also einen Char bekommst und von diesem den "Basiswert" 48 oder 0x30 oder '0' abziehst (alles das Gleiche), dann bekommst du als Rest den Ziffernwert.

In die andere Richtung geht es ebenso. Der Trick zu einer Lösung, auch bei Buchstaben, ist meistens sich die zum Zeichen zugehörigen Zahlenwerte anzuschauen und den Zusammenhang zu erkennen.
 
Was benötigst du jetzt bitte?

Titel = "int to char"

Jetzt will ich diese '3' aber als "rechnbare" Variable haben also z.B. int i = 1 + 2;
Wie übergebe ich der Unterfunktion jetzt die integer 3, damit sie diese als character '3' also Ascii äquivalent 51 versteht?

Um es einfach zu machen:

  • char zu int --> atoi
  • int zu char --> itoa

@KingLz Du hast mit allem recht was du schreibst. Viele haben heute aber kein Interesse mehr, sich damit auseinander zu setzen, wenn es doch fertige Funktionen dafür gibt...obwohl es bestimmt auch nicht schaden würde.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Raijin und BeBur
So'n bischen klingt das schon irgendwie nach Hausaufgabe. Normalerweise würde man eine Funktion, die Berechungen durchführt, ja mit Integer-Parametern (oder ggfs float, etc) definieren. Dass hier nun eine Rechen-Funktion chars erwartet, klingt nach einer konstruierten Programmieraufgabe vom Lehrer.

Wenn man damit Probleme hat, ist das ja ok, aber google sollte heutzutage jeder verwenden können.
 
Dshing schrieb:
Ich habe eine Unterfunktion, die ein character übergeben bekommen will um es zu interpretieren
Kannst du mal genauer erläutern, was dein Programm/diese Funktion macht?

Kommt mir so vor, als wäre des generell der falsche Weg den du hier einschlagen möchtest
 
Die Variante '0' zu addieren funktioniert, was letztlich auch ja nur eine Addition von 48 ist. Da bin ich aber einfach nicht drauf gekommen, das war zu nahelegend. Danke dafür ;)

Mit itoa funktioniert es nicht, das war auch meine erste Idee aber es gibt letztlich immer nur 3 wieder, aber nicht 51.
 
Dshing schrieb:
Mit itoa funktioniert es nicht, das war auch meine erste Idee aber es gibt letztlich immer nur 3 wieder, aber nicht 51.
Hä??
Anfangs hieß es noch:
Dshing schrieb:
Jetzt will ich diese '3' aber als "rechnbare" Variable haben also z.B. int i = 1 + 2;
Es wird immer unklarer was du überhaupt erreichen willst. Wenn du mit der Information, die in '3' steckt, rechnen willst, ist die 51 doch gar nicht das Ziel, sondern eben die Zahl 3 ! Oder was genau hast du sonst damit vor? Im Idealfall bei solchen Fragen daher immer die Rahmenbedingungen näher beschreiben, gerne auch mit Code-Snippets.


atoi und itoa wandeln einen String in einen Integer um und umgekehrt. Sie übersetzen sozusagen die Information von einem Datentyp in den anderen, also zB das was der Mensch an dieser Stelle sieht:

'3' <> 3

Wie der Computer dabei das Zeichen oder die Zahl letztendlich im Speicher ablegt, ist vollkommen irrelevant. Auf dem Speicherplatz des chars steht etwas vollkommen anderes als auf dem Speicherplatz des Integers.

Interpretierter Zahlenwert vs Zeichen (convert)
Code:
char zeichen = '3';
int zahlenwert = atoi(zeichen);
// --> zahlenwert = 3

char buffer[10];
itoa(zahlenwert, buffer, 10);
// --> buffer = "3"


Wenn du hingegen den ASCII-Wert eines char willst, musst du ihn einfach nur casten. Beim Casten wird das was im Speicher abgelegt ist einfach nur anders interpretiert. Das Programm liest also das Zeichen vom Speicher, "tut aber so als wäre es eine Zahl". Heraus kommt der ASCII-Wert, weil dasselbe Bitmuster im Speicher, das für '3' steht - nämlich 0011 0011 - eben auch die Zahl 51 ergibt.


ASCII-Wert vs Zeichen (cast)

Code:
char zeichen = '3';
int asciiwert = (int) zeichen;
// --> asciiwert = 51

char zeichen2 = (char) asciiwert;
// --> zeichen2 = '3'


Natürlich kann man aus einem Zeichen, das eine Zahl darstellt, auch aktiv den ASCII-Wert berechnen, wenn man die ASCII-Tabelle kennt, aber das ist bei der Verwendung von atoi bzw. itoa gar nicht notwendig. Letztendlich muss man ja auch daran denken, dass ASCII gar nicht alle Zeichen abdeckt, sondern nur den kleinsten gemeinsamen Nenner darstellt. Spätestens dann, wenn man also nicht nur a-z, A-Z und 0-9 verwendet, kommen so oder so Encodings / Code Pages ins Spiel und dann ist der Drops eh gelutscht und man ist gezwungen, Konvertierfunktionen zu verwenden.


Übrigens: In jedem Fall muss man natürlich auch sicherstellen, dass im char tatsächlich eine Zahl und kein Buchstabe drinsteckt. Sonst kann das schnell ins Auge gehen, wenn man das ungeprüft durchwinkt.
 
Um hier mal ein bisschen Fehlinfos nochmal aufzuräumen

M@rsupil@mi schrieb:
Code:
int i;
char c = '3';
i = (int)c;
Ein Character-Literal hat in C den Typ int. Der Code ist überflüssig.

KingLz schrieb:
In der Tabelle siehst du, dass Ascii 0 den Wert 48 oder 0x30 hat. Alle weiteren Ziffern sind aufsteigend dahinter. Wenn du nun also einen Char bekommst und von diesem den "Basiswert" 48 oder 0x30 oder '0' abziehst (alles das Gleiche), dann bekommst du als Rest den Ziffernwert.
Das mag stimmen, ist aber irrelevant. Der C-Standard schreibt nicht vor, dass ASCII verwendet wird.
Nichtsdestotrotz ist es garantiert, dass Herangehensweise funktioniert:
C11 §5.2.1(3): "[...] In both the source and execution basic character sets, the
value of each character after 0 in the above list of decimal digits shall be one greater than
the value of the previous. [...]"

rlchampion schrieb:
  • int zu char --> itoa

Gibt es im C-Standard nicht. Eine portable Möglichkeit ist sprintf.

Raijin schrieb:
Interpretierter Zahlenwert vs Zeichen (convert)
Code:
char zeichen = '3';
int zahlenwert = atoi(zeichen);
// --> zahlenwert = 3
Das ist falsch. Die Funktion atoi nimmt einen Null-terminierten String und kein einzelnen Char.
Korrekt wäre z.B. das hier:
Code:
char zeichen[2] = { '3' };
int zahlenwert = atoi(zeichen);
// --> zahlenwert = 3
 
  • Gefällt mir
Reaktionen: adAstra
nullPtr schrieb:
Der C-Standard schreibt nicht vor, dass ASCII verwendet wird.

Da hast du natürlich vollkommen Recht. Das einzige was relativ sicher ist, dass es sich bei einem Char um einen 8 Bit Wert handelt. Die Interpretation des Wertes ist natürlich vollkommen willkürlich. Nichtsdestotrotz ist es vermutlich sehr wahrscheinlich, dass einem der ASCII Zeichensatz hier weiterhilft. Sollte das C Programm für einen Mikrocontroller programmiert werden, so hilft auch der C Standard nichts, da bei Mikrocontrollern oft nur Sprachuntermengen verwendet werden.

Ich wollte mit meiner Antwort dem OP auch nur den prinzipiellen Lösungsansatz zeigen.
 
Zurück
Oben