现在我正在尝试在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;
}
答案 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)
存储在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)
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
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