web-dev-qa-db-de.com

Konvertierung von int in char in C

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;
}
4
Kyle Hobbs

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;
}
6
P__J__

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.

4
Bathsheba

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

Ref Wie verwende ich zusammengesetzte Literale für fprintf() mehrere formatierte Zahlen mit beliebigen Basen?

1
chux

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;
}
1
dbush

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. 

0
Jonathan Howard

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

0
savram