Im Moment versuche ich in der C-Programmierung ein Int in ein Zeichen umzuwandeln. Nach Recherchen stellte ich fest, dass ich es so machen sollte:
int value = 10;
char result = (char) value;
Was ich möchte, ist, dass dies 'A' zurückgibt (und für 0-9 '0' - '9'), aber dies gibt eine neue Zeile aus, die ich denke .. __ Meine ganze Funktion sieht folgendermaßen aus:
char int2char (int radix, int value) {
if (value < 0 || value >= radix) {
return '?';
}
char result = (char) value;
return result;
}
um int in char zu konvertieren, müssen Sie nichts tun
char x;
int y;
/* do something */
x = y;
nur eine int bis char-Zahl als druckbare (normalerweise ASCII) Ziffer wie in Ihrem Beispiel:
const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int inttochar(int val, int base)
{
return digits[val % base];
}
wenn Sie in den String (char *) konvertieren möchten, müssen Sie eine der stansdard-Funktionen wie sprintf, itoa, ltoa, utoa, ultoa .... verwenden.
char *reverse(char *str);
const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *convert(int number, char *buff, int base)
{
char *result = (buff == NULL || base > strlen(digits) || base < 2) ? NULL : buff;
char sign = 0;
if (number < 0)
{
sign = '-';
}
if (result != NULL)
{
do
{
*buff++ = digits[abs(number % (base ))];
number /= base;
} while (number);
if(sign) *buff++ = sign;
if (!*result) *buff++ = '0';
*buff = 0;
reverse(result);
}
return result;
}
Eine Methode von portable wäre, a zu definieren
const char* foo = "0123456789ABC...";
dabei sind ...
die restlichen Zeichen, die Sie berücksichtigen möchten.
Dann und foo[value]
wird zu einer bestimmten char
ausgewertet. Zum Beispiel wird foo[0]
'0'
sein und foo[10]
wird 'A'
sein.
Wenn Sie von einer bestimmten encodierung ausgehen (wie zum Beispiel dem allgemeinen, aber keinesfalls allgegenwärtigen ASCII-Code), ist Ihr Code nicht streng portierbar.
Umwandlung von Int in Char
Ich nehme an, dass OP mehr will, als nur eine 1-stellige Konvertierung als radix
geliefert wurde.
Um eine int
in eine string umzuwandeln (nicht nur 1 char
), gibt es den Ansatz sprintf(buf, "%d", value)
.
Um dies zu erreichen, wird das String-Management zu einem Problem und behandelt den Eckfall von INT_MIN
.
Die folgende C99-Lösung gibt einen char*
zurück, dessen Lebensdauer bis zum Ende des Blocks gültig ist. Dazu wird ein compound literal über das Makro bereitgestellt.
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
// Maximum buffer size needed
#define ITOA_BASE_N (sizeof(unsigned)*CHAR_BIT + 2)
char *itoa_base(char *s, int x, int base) {
s += ITOA_BASE_N - 1;
*s = '\0';
if (base >= 2 && base <= 36) {
int x0 = x;
do {
*(--s) = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[abs(x % base)];
x /= base;
} while (x);
if (x0 < 0) {
*(--s) = '-';
}
}
return s;
}
#define TO_BASE(x,b) itoa_base((char [ITOA_BASE_N]){0} , (x), (b))
Verwendungsbeispiel und Tests
void test(int x) {
printf("base10:% 11d base2:%35s base36:%7s ", x, TO_BASE(x, 2), TO_BASE(x, 36));
printf("%ld\n", strtol(TO_BASE(x, 36), NULL, 36));
}
int main(void) {
test(0);
test(-1);
test(42);
test(INT_MAX);
test(-INT_MAX);
test(INT_MIN);
}
Ausgabe
base10: 0 base2: 0 base36: 0 0
base10: -1 base2: -1 base36: -1 -1
base10: 42 base2: 101010 base36: 16 42
base10: 2147483647 base2: 1111111111111111111111111111111 base36: ZIK0ZJ 2147483647
base10:-2147483647 base2: -1111111111111111111111111111111 base36:-ZIK0ZJ -2147483647
base10:-2147483648 base2: -10000000000000000000000000000000 base36:-ZIK0ZK -2147483648
Zeichen verwenden eine Kodierung (normalerweise ASCII), um Zahlen einem bestimmten Zeichen zuzuordnen. Die Codes für die Zeichen '0'
bis '9'
sind aufeinanderfolgend, sodass Sie bei Werten unter 10 den Wert zur Zeichenkonstante '0'
hinzufügen. Bei einem Wert von 10 oder mehr fügen Sie der Zeichenkonstante 'A'
den Wert minus 10 hinzu:
char result;
if (value >= 10) {
result = 'A' + value - 10;
} else {
result = '0' + value;
}
Die Zeichen in C basieren also auf ASCII (oder UTF-8, das mit ASCII-Codes abwärtskompatibel ist). Dies bedeutet, dass "A" unter der Haube tatsächlich die Zahl "65" ist (außer binär und nicht dezimal). Alles, was ein "char" in C ist, ist eine ganze Zahl mit genug Bytes, um jedes ASCII Zeichen darzustellen. Wenn Sie eine int
in eine char
konvertieren möchten, müssen Sie den Computer anweisen, die Bytes eines Int als ASCII -Werte zu interpretieren - und es ist schon eine Weile her, seit ich C ausgeführt habe, aber ich glaube das Compiler wird sich beschweren, da char
weniger Bytes als int
enthält. Das heißt, wir brauchen eine Funktion, wie Sie geschrieben haben. Somit,
if(value < 10) return '0'+value;
return 'A'+value-10;
wird das sein, was Sie von Ihrer Funktion zurückgeben möchten. Halten Sie Ihre Grenzen mit "radix" so wie Sie es getan haben, imho ist dies eine gute Praxis in C.
Schauen Sie sich die Tabelle ascii an
Die in einem Zeichen gespeicherten Werte werden als die dieser Tabelle entsprechenden Zeichen interpretiert. Der Wert 10 ist ein Newline