我想将整数转换为C中的数字字符字符串。
我尝试使用itoa
,但是它不是标准的,也不是我的C库提供的。
我尝试实现自己的itoa
,但无法正常工作:
#include <stdlib.h>
#include <stdio.h>
char *itoa(int val, char *buf, int base)
{
size_t ctr = 0;
for( ; val; val /= base )
{
buf[ctr++] = '0' + (val % base);
}
buf[ctr] = 0;
return buf;
}
int main(void)
{
unsigned char c = 201;
char *buf = malloc(sizeof(c)*8+1);
itoa(c, buf, 2);
puts(buf);
free(buf);
}
它提供反向输出。
例如,如果c
为'A'
,而base
为2
,则输出为:0101101
我想要的输出是这样的:1011010
如何解决此问题?
我已经看到了以下问题:Is there a printf converter to print in binary format?
我不希望printf
格式说明符将整数打印为二进制,我想将二进制转换为字符串。
我已经看到了以下问题:Print an int in binary representation using C
尽管答案确实将整数转换为二进制数字字符串,但这是唯一可以做的事情。
我希望我的itoa
能够与其他base
,例如10
,8
等一起使用并正确打印(即{{1} }转换为12345
而不是"12345"
)。
我不想使用"11000000111001"
或printf
来做到这一点。
我不在乎字符串的长度,sprintf
和1
对我来说意义相同。
我不想将整数转换为数字字符以外的ASCII字符。
答案 0 :(得分:2)
如何修复我的
itoa
实现,使其不显示反向输出?
从右到左形成字符串,而不是反转字符串。 @user3386109中的#4
我建议helper函数也要接收一个大小。
#include <limits.h>
char* itostr(char *dest, size_t size, int a, int base) {
// Max text needs occur with itostr(dest, size, INT_MIN, 2)
char buffer[sizeof a * CHAR_BIT + 1 + 1];
static const char digits[36] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (base < 2 || base > 36) {
fprintf(stderr, "Invalid base");
return NULL;
}
// Start filling from the end
char* p = &buffer[sizeof buffer - 1];
*p = '\0';
// Work with negative `int`
int an = a < 0 ? a : -a;
do {
*(--p) = digits[-(an % base)];
an /= base;
} while (an);
if (a < 0) {
*(--p) = '-';
}
size_t size_used = &buffer[sizeof(buffer)] - p;
if (size_used > size) {
fprintf(stderr, "Scant buffer %zu > %zu", size_used , size);
return NULL;
}
return memcpy(dest, p, size_used);
}
然后使用复合文字来提供记忆。
// compound literal C99 or later
#define INT_STR_SIZE (sizeof(int)*CHAR_BIT + 2)
#define MY_ITOA(x, base) itostr((char [INT_STR_SIZE]){""}, INT_STR_SIZE, (x), (base))
现在您可以多次调用它。
int main(void) {
printf("%s %s %s %s\n", MY_ITOA(INT_MIN,10), MY_ITOA(-1,10), MY_ITOA(0,10), MY_ITOA(INT_MAX,10));
printf("%s %s\n", MY_ITOA(INT_MIN,2), MY_ITOA(INT_MIN,36));
return (0);
}
输出
-2147483648 -1 0 2147483647
-10000000000000000000000000000000 -ZIK0ZK
注意:对于sizeof(c)*8+1
,以2为底的数字,INT_MIN
太小了。
答案 1 :(得分:1)
此解决方案对我有用:
eq