在C

时间:2017-09-01 19:30:39

标签: c type-conversion

现在我正在尝试在C编程中将int转换为char。经过研究,我发现我应该能够这样做:

int value = 10;
char result = (char) value;

我想要的是返回' A' (并且0-9返回' 0' - ' 9')但这会返回我想的新行字符。 我的整个功能看起来像这样:

char int2char (int radix, int value) {
  if (value < 0 || value >= radix) {
    return '?';
  }

  char result = (char) value;

  return result;
}

7 个答案:

答案 0 :(得分:6)

将int转换为char,您无需执行任何操作

char x;
int y;


/* do something */

x = y;

只有一个int to char值作为可打印(通常是ASCII)数字,如示例所示:

const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

int inttochar(int val, int base)
{
    return digits[val % base];
}

如果你想转换为字符串(char *),那么你需要使用任何stansdard函数,如sprintf,itoa,ltoa,utoa,ultoa ....或者自己写一个:

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

答案 1 :(得分:4)

便携式这样做的方法是定义

const char* foo = "0123456789ABC...";

其中...是您要考虑的其余字符。

然后,foo[value]将评估为特定的char。例如,foo[0]将为'0'foo[10]将为'A'

如果你假设一个特定的编码(例如常见但不是普遍存在的ASCII)那么你的代码就不是严格可移植的。

答案 2 :(得分:1)

字符使用编码(通常为ASCII)将数字映射到特定字符。字符'0''9'的代码是连续的,因此对于小于10的值,您可以将值添加到字符常量'0'。对于值10或更多,您将值减去10添加到字符常量'A'

char result;
if (value >= 10) {
    result = 'A' + value - 10;
} else {
    result = '0' + value;
}

答案 3 :(得分:1)

  

将Int转换为Char

我认为只要提供radix,OP就需要更多的转换。

要将int转换为字符串,(不只是1 char),有sprintf(buf, "%d", value)方法。

为了对任何基数这样做,字符串管理成为一个问题,并处理INT_MIN

的极端情况

以下C99解决方案返回char*,其生命周期对块的末尾有效。它是通过宏提供复合文字来实现的。

#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))

样本用法和测试

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);
}

输出

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

参考How to use compound literals to fprintf() multiple formatted numbers with arbitrary bases?

答案 4 :(得分:0)

查看ascii table

存储在char中的值被解释为与该表对应的字符。值10是换行符

答案 5 :(得分:0)

因此C中的字符基于ASCII(或UTF-8,它与ascii代码向后兼容)。这意味着在引擎盖下,“A”实际上是数字“65”(二进制而不是十进制除外)。 C中的所有“char”都是一个整数,其中有足够的字节来表示每个ASCII字符。如果要将int转换为char,则需要指示计算机将int的字节解释为ASCII值 - 自从我完成C以来已经有一段时间了,但我相信编译器会抱怨,因为char保存的字节数少于int。这意味着我们需要一个函数,正如您所写的那样。因此,

if(value < 10) return '0'+value;
return 'A'+value-10;

将是您想要从函数返回的内容。保持你的边界检查你的“基数”,这是在C中的好习惯。

答案 6 :(得分:0)

1。通过类型转换将int转换为char

源文件 charConvertByCasting.c

#include <stdio.h>

int main(){
    int i = 66;              // ~~Type Casting Syntax~~
    printf("%c", (char) i); //  (type_name) expression
    return 0;
}

可执行的 charConvertByCasting.exe 命令行输出:

C:\Users\boqsc\Desktop\tcc>tcc -run charconvert.c
B

其他资源:
https://www.tutorialspoint.com/cprogramming/c_type_casting.htm https://www.tutorialspoint.com/cprogramming/c_data_types.htm

2。通过分配将int转换为char

源文件 charConvertByAssignment.c

#include <stdio.h>

int main(){
    int i = 66;
    char c = i;
    printf("%c", c);
    return 0;
}

可执行的 charConvertByAssignment.exe 命令行输出:

C:\Users\boqsc\Desktop\tcc>tcc -run charconvert.c
B